Routing.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
  1. <?php
  2. /**
  3. * This file is part of the ForkBB <https://github.com/forkbb>.
  4. *
  5. * @copyright (c) Visman <mio.visman@yandex.ru, https://github.com/MioVisman>
  6. * @license The MIT License (MIT)
  7. */
  8. declare(strict_types=1);
  9. namespace ForkBB\Controllers;
  10. use ForkBB\Core\Container;
  11. use ForkBB\Models\Page;
  12. class Routing
  13. {
  14. /**
  15. * Контейнер
  16. * @var Container
  17. */
  18. protected $c;
  19. public function __construct(Container $container)
  20. {
  21. $this->c = $container;
  22. }
  23. /**
  24. * Маршрутиризация
  25. */
  26. public function routing(): Page
  27. {
  28. $user = $this->c->user;
  29. $config = $this->c->config;
  30. $r = $this->c->Router;
  31. // регистрация/вход/выход
  32. if ($user->isGuest) {
  33. // вход
  34. $r->add(
  35. $r::DUO,
  36. '/login',
  37. 'Auth:login',
  38. 'Login'
  39. );
  40. // забыли кодовую фразу
  41. $r->add(
  42. $r::DUO,
  43. '/login/forget',
  44. 'Auth:forget',
  45. 'Forget'
  46. );
  47. // смена кодовой фразы
  48. $r->add(
  49. $r::DUO,
  50. '/login/{id|i:[1-9]\d*}/{key}/{hash}',
  51. 'Auth:changePass',
  52. 'ChangePassword'
  53. );
  54. // регистрация
  55. if (1 === $config->b_regs_allow) {
  56. $r->add(
  57. $r::GET,
  58. '/registration',
  59. 'Rules:confirmation',
  60. 'Register'
  61. );
  62. $r->add(
  63. $r::PST,
  64. '/registration/agree',
  65. 'Register:reg',
  66. 'RegisterForm'
  67. );
  68. $r->add(
  69. $r::GET,
  70. '/registration/activate/{id|i:[1-9]\d*}/{key}/{hash}',
  71. 'Register:activate',
  72. 'RegActivate'
  73. );
  74. }
  75. } else {
  76. // выход
  77. $r->add(
  78. $r::GET,
  79. '/logout/{token}',
  80. 'Auth:logout',
  81. 'Logout'
  82. );
  83. // обработка "кривых" перенаправлений с логина и регистрации
  84. $r->add(
  85. $r::GET,
  86. '/login[/{tail:.*}]',
  87. 'Redirect:toIndex'
  88. );
  89. $r->add(
  90. $r::GET,
  91. '/registration[/{tail:.*}]',
  92. 'Redirect:toIndex'
  93. );
  94. }
  95. // просмотр разрешен
  96. if (1 === $user->g_read_board) {
  97. // главная
  98. $r->add(
  99. $r::GET,
  100. '/',
  101. 'Index:view',
  102. 'Index'
  103. );
  104. $r->add(
  105. $r::GET,
  106. '/index.php',
  107. 'Redirect:toIndex'
  108. );
  109. $r->add(
  110. $r::GET,
  111. '/index.html',
  112. 'Redirect:toIndex'
  113. );
  114. // правила
  115. if (
  116. 1 === $config->b_rules
  117. && (
  118. ! $user->isGuest
  119. || 1 === $config->b_regs_allow
  120. )
  121. ) {
  122. $r->add(
  123. $r::GET,
  124. '/rules',
  125. 'Rules:view',
  126. 'Rules'
  127. );
  128. }
  129. // поиск
  130. if (1 === $user->g_search) {
  131. $r->add(
  132. $r::GET,
  133. '/search[/simple/{keywords}[/{page|i:[1-9]\d*}]]',
  134. 'Search:view',
  135. 'Search'
  136. );
  137. $r->add(
  138. $r::PST,
  139. '/search',
  140. 'Search:view'
  141. );
  142. $r->add(
  143. $r::GET,
  144. '/search/advanced[/{keywords}/{author}/{forums}/{serch_in:\d}/{sort_by:\d}/{sort_dir:\d}/{show_as:\d}[/{page|i:[1-9]\d*}]]',
  145. 'Search:viewAdvanced',
  146. 'SearchAdvanced'
  147. );
  148. $r->add(
  149. $r::PST,
  150. '/search/advanced',
  151. 'Search:viewAdvanced'
  152. );
  153. $r->add(
  154. $r::GET,
  155. '/search[/user/{uid|i:[1-9]\d*}]/{action:(?!search)[a-z_]+}[/in_forum/{forum|i:[1-9]\d*}][/{page|i:[1-9]\d*}]',
  156. 'Search:action',
  157. 'SearchAction'
  158. );
  159. }
  160. // юзеры
  161. if ($user->viewUsers) {
  162. // список пользователей
  163. $r->add(
  164. $r::GET,
  165. '/userlist[/{group:all|[1-9]\d*}/{sort:username|registered|num_posts}/{dir:ASC|DESC}/{name}][/{page|i:[1-9]\d*}]',
  166. 'Userlist:view',
  167. 'Userlist'
  168. );
  169. $r->add(
  170. $r::PST,
  171. '/userlist',
  172. 'Userlist:view'
  173. );
  174. // юзеры
  175. $r->add(
  176. $r::GET,
  177. '/user/{id|i:[1-9]\d*}/{name}',
  178. 'ProfileView:view',
  179. 'User'
  180. );
  181. $r->add(
  182. $r::DUO,
  183. '/user/{id|i:[1-9]\d*}/edit/profile',
  184. 'ProfileEdit:edit',
  185. 'EditUserProfile'
  186. );
  187. $r->add(
  188. $r::DUO,
  189. '/user/{id|i:[1-9]\d*}/edit/config',
  190. 'ProfileConfig:config',
  191. 'EditUserBoardConfig'
  192. );
  193. $r->add(
  194. $r::DUO,
  195. '/user/{id|i:[1-9]\d*}/edit/email',
  196. 'ProfileEmail:email',
  197. 'EditUserEmail'
  198. );
  199. $r->add(
  200. $r::DUO,
  201. '/user/{id|i:[1-9]\d*}/edit/passphrase',
  202. 'ProfilePass:pass',
  203. 'EditUserPass'
  204. );
  205. $r->add(
  206. $r::DUO,
  207. '/user/{id|i:[1-9]\d*}/edit/moderation',
  208. 'ProfileMod:moderation',
  209. 'EditUserModeration'
  210. );
  211. } elseif (! $user->isGuest) {
  212. // только свой профиль
  213. $r->add(
  214. $r::GET,
  215. '/user/{id|i:' . $user->id . '}/{name}',
  216. 'ProfileView:view',
  217. 'User'
  218. );
  219. $r->add(
  220. $r::DUO,
  221. '/user/{id|i:' . $user->id . '}/edit/profile',
  222. 'ProfileEdit:edit',
  223. 'EditUserProfile'
  224. );
  225. $r->add(
  226. $r::DUO,
  227. '/user/{id|i:' . $user->id . '}/edit/config',
  228. 'ProfileConfig:config',
  229. 'EditUserBoardConfig'
  230. );
  231. $r->add(
  232. $r::DUO,
  233. '/user/{id|i:' . $user->id . '}/edit/email',
  234. 'ProfileEmail:email',
  235. 'EditUserEmail'
  236. );
  237. $r->add(
  238. $r::DUO,
  239. '/user/{id|i:' . $user->id . '}/edit/passphrase',
  240. 'ProfilePass:pass',
  241. 'EditUserPass'
  242. );
  243. }
  244. // смена своего email
  245. if (! $user->isGuest) {
  246. $r->add(
  247. $r::GET,
  248. '/user/{id|i:' . $user->id . '}/{email}/{key}/{hash}',
  249. 'ProfileEmail:setEmail',
  250. 'SetNewEmail'
  251. );
  252. }
  253. // пометка разделов прочитанными
  254. if (! $user->isGuest) {
  255. $r->add(
  256. $r::GET,
  257. '/forum/{id|i:\d+}/markread/{token}',
  258. 'Misc:markread',
  259. 'MarkRead'
  260. );
  261. }
  262. // разделы
  263. $r->add(
  264. $r::GET,
  265. '/forum/{id|i:[1-9]\d*}/{name}[/{page|i:[1-9]\d*}]',
  266. 'Forum:view',
  267. 'Forum'
  268. );
  269. $r->add(
  270. $r::DUO,
  271. '/forum/{id|i:[1-9]\d*}/new/topic',
  272. 'Post:newTopic',
  273. 'NewTopic'
  274. );
  275. // темы
  276. $r->add(
  277. $r::GET,
  278. '/topic/{id|i:[1-9]\d*}/{name}[/{page|i:[1-9]\d*}]',
  279. 'Topic:viewTopic',
  280. 'Topic'
  281. );
  282. $r->add(
  283. $r::GET,
  284. '/topic/{id|i:[1-9]\d*}/view/new',
  285. 'Topic:viewNew',
  286. 'TopicViewNew'
  287. );
  288. $r->add(
  289. $r::GET,
  290. '/topic/{id|i:[1-9]\d*}/view/unread',
  291. 'Topic:viewUnread',
  292. 'TopicViewUnread'
  293. );
  294. $r->add(
  295. $r::GET,
  296. '/topic/{id|i:[1-9]\d*}/view/last',
  297. 'Topic:viewLast',
  298. 'TopicViewLast'
  299. );
  300. $r->add(
  301. $r::GET,
  302. '/topic/{id|i:[1-9]\d*}/new/reply[/{quote|i:[1-9]\d*}]',
  303. 'Post:newReply',
  304. 'NewReply'
  305. );
  306. $r->add(
  307. $r::PST,
  308. '/topic/{id|i:[1-9]\d*}/new/reply',
  309. 'Post:newReply'
  310. );
  311. // сообщения
  312. $r->add(
  313. $r::GET,
  314. '/post/{id|i:[1-9]\d*}#p{id}',
  315. 'Topic:viewPost',
  316. 'ViewPost'
  317. );
  318. $r->add(
  319. $r::DUO,
  320. '/post/{id|i:[1-9]\d*}/edit',
  321. 'Edit:edit',
  322. 'EditPost'
  323. );
  324. $r->add(
  325. $r::DUO,
  326. '/post/{id|i:[1-9]\d*}/delete',
  327. 'Delete:delete',
  328. 'DeletePost'
  329. );
  330. // сигналы (репорты)
  331. if (
  332. ! $user->isAdmin
  333. && ! $user->isGuest
  334. ) {
  335. $r->add(
  336. $r::DUO,
  337. '/post/{id|i:[1-9]\d*}/report',
  338. 'Report:report',
  339. 'ReportPost'
  340. );
  341. }
  342. // отправка email
  343. if (
  344. ! $user->isGuest
  345. && 1 === $user->g_send_email
  346. ) {
  347. $r->add(
  348. $r::DUO,
  349. '/send_email/{id|i:[1-9]\d*}/{hash}',
  350. 'Email:email',
  351. 'SendEmail'
  352. );
  353. }
  354. // feed
  355. $r->add(
  356. $r::GET,
  357. '/feed/{type:atom|rss}[/forum/{fid|i:[1-9]\d*}][/topic/{tid|i:[1-9]\d*}]',
  358. 'Feed:view',
  359. 'Feed'
  360. );
  361. // подписки
  362. if (
  363. ! $user->isGuest
  364. && ! $user->isUnverified
  365. ) {
  366. $r->add(
  367. $r::GET,
  368. '/forum/{fid|i:[1-9]\d*}/{type:subscribe|unsubscribe}/{token}',
  369. 'Misc:forumSubscription',
  370. 'ForumSubscription'
  371. );
  372. $r->add(
  373. $r::GET,
  374. '/topic/{tid|i:[1-9]\d*}/{type:subscribe|unsubscribe}/{token}',
  375. 'Misc:topicSubscription',
  376. 'TopicSubscription'
  377. );
  378. }
  379. // личные сообщения
  380. if ($user->usePM) {
  381. $r->add(
  382. $r::GET,
  383. '/pm',
  384. 'PM:action',
  385. 'PM'
  386. );
  387. $r->add(
  388. $r::DUO,
  389. '/pm[/user/{second}][/{action}[/{more1|i:[1-9]\d*}[/{more2}]]][#p{numPost}]',
  390. 'PM:action',
  391. 'PMAction'
  392. );
  393. }
  394. }
  395. // опросы
  396. if ($user->usePoll) {
  397. $r->add(
  398. $r::PST,
  399. '/poll/{tid|i:[1-9]\d*}',
  400. 'Poll:vote',
  401. 'Poll'
  402. );
  403. }
  404. // админ и модератор
  405. if ($user->isAdmMod) {
  406. $r->add(
  407. $r::GET,
  408. '/admin/',
  409. 'AdminIndex:index',
  410. 'Admin'
  411. );
  412. $r->add(
  413. $r::GET,
  414. '/admin/statistics',
  415. 'AdminStatistics:statistics',
  416. 'AdminStatistics'
  417. );
  418. if ($this->c->userRules->viewIP) {
  419. $r->add(
  420. $r::GET,
  421. '/admin/get/host/{ip:[0-9a-fA-F:.]+}',
  422. 'AdminHost:view',
  423. 'AdminHost'
  424. );
  425. $r->add(
  426. $r::GET,
  427. '/admin/users/user/{id|i:[1-9]\d*}[/{page|i:[1-9]\d*}]',
  428. 'AdminUsersStat:view',
  429. 'AdminUserStat'
  430. );
  431. }
  432. $r->add(
  433. $r::DUO,
  434. '/admin/users',
  435. 'AdminUsers:view',
  436. 'AdminUsers'
  437. );
  438. $r->add(
  439. $r::DUO,
  440. '/admin/users/result/{data}[/{page|i:[1-9]\d*}]',
  441. 'AdminUsersResult:view',
  442. 'AdminUsersResult'
  443. );
  444. $r->add(
  445. $r::DUO,
  446. '/admin/users/{action:\w+}/{ids:\d+(?:-\d+)*}[/{token}]',
  447. 'AdminUsersAction:view',
  448. 'AdminUsersAction'
  449. );
  450. $r->add(
  451. $r::GET,
  452. '/admin/users/promote/{uid|i:[1-9]\d*}/{pid|i:[1-9]\d*}/{token}',
  453. 'AdminUsersPromote:promote',
  454. 'AdminUserPromote'
  455. );
  456. if ($user->isAdmin) {
  457. $r->add(
  458. $r::DUO,
  459. '/admin/users/new',
  460. 'AdminUsersNew:view',
  461. 'AdminUsersNew'
  462. );
  463. $r->add(
  464. $r::PST,
  465. '/admin/users/recalculate',
  466. 'AdminUsers:recalculate',
  467. 'AdminUsersRecalculate'
  468. );
  469. }
  470. if ($this->c->userRules->banUsers) {
  471. $r->add(
  472. $r::DUO,
  473. '/admin/bans',
  474. 'AdminBans:view',
  475. 'AdminBans'
  476. );
  477. $r->add(
  478. $r::DUO,
  479. '/admin/bans/new[/{ids:\d+(?:-\d+)*}[/{uid|i:[1-9]\d*}]]',
  480. 'AdminBans:add',
  481. 'AdminBansNew'
  482. );
  483. $r->add(
  484. $r::DUO,
  485. '/admin/bans/edit/{id|i:[1-9]\d*}',
  486. 'AdminBans:edit',
  487. 'AdminBansEdit'
  488. );
  489. $r->add(
  490. $r::GET,
  491. '/admin/bans/result/{data}[/{page|i:[1-9]\d*}]',
  492. 'AdminBans:result',
  493. 'AdminBansResult'
  494. );
  495. $r->add(
  496. $r::GET,
  497. '/admin/bans/delete/{id|i:[1-9]\d*}/{token}[/{uid|i:[1-9]\d*}]',
  498. 'AdminBans:delete',
  499. 'AdminBansDelete'
  500. );
  501. }
  502. if (
  503. $user->isAdmin
  504. || 0 === $config->i_report_method
  505. || 2 === $config->i_report_method
  506. ) {
  507. $r->add(
  508. $r::GET,
  509. '/admin/reports',
  510. 'AdminReports:view',
  511. 'AdminReports'
  512. );
  513. $r->add(
  514. $r::GET,
  515. '/admin/reports/zap/{id|i:[1-9]\d*}/{token}',
  516. 'AdminReports:zap',
  517. 'AdminReportsZap'
  518. );
  519. }
  520. $r->add(
  521. $r::PST,
  522. '/moderate',
  523. 'Moderate:action',
  524. 'Moderate'
  525. );
  526. }
  527. // только админ
  528. if ($user->isAdmin) {
  529. $r->add(
  530. $r::GET,
  531. '/admin/statistics/info',
  532. 'AdminStatistics:info',
  533. 'AdminInfo'
  534. );
  535. $r->add(
  536. $r::GET,
  537. '/admin/statistics/info/{time|i:\d+}',
  538. 'AdminStatistics:infoCSS',
  539. 'AdminInfoCSS'
  540. );
  541. $r->add(
  542. $r::DUO,
  543. '/admin/options',
  544. 'AdminOptions:edit',
  545. 'AdminOptions'
  546. );
  547. $r->add(
  548. $r::DUO,
  549. '/admin/parser',
  550. 'AdminParser:edit',
  551. 'AdminParser'
  552. );
  553. $r->add(
  554. $r::DUO,
  555. '/admin/parser/bbcode',
  556. 'AdminParserBBCode:view',
  557. 'AdminBBCode'
  558. );
  559. $r->add(
  560. $r::DUO,
  561. '/admin/parser/bbcode/delete/{id|i:[1-9]\d*}',
  562. 'AdminParserBBCode:delete',
  563. 'AdminBBCodeDelete'
  564. );
  565. $r->add(
  566. $r::DUO,
  567. '/admin/parser/bbcode/edit/{id|i:[1-9]\d*}',
  568. 'AdminParserBBCode:edit',
  569. 'AdminBBCodeEdit'
  570. );
  571. $r->add(
  572. $r::DUO,
  573. '/admin/parser/bbcode/new',
  574. 'AdminParserBBCode:edit',
  575. 'AdminBBCodeNew'
  576. );
  577. $r->add(
  578. $r::GET,
  579. '/admin/parser/bbcode/default/{id|i:[1-9]\d*}/{token}',
  580. 'AdminParserBBCode:default',
  581. 'AdminBBCodeDefault'
  582. );
  583. $r->add(
  584. $r::DUO,
  585. '/admin/parser/smilies',
  586. 'AdminParserSmilies:view',
  587. 'AdminSmilies'
  588. );
  589. $r->add(
  590. $r::GET,
  591. '/admin/parser/smilies/delete/{name}/{token}',
  592. 'AdminParserSmilies:delete',
  593. 'AdminSmiliesDelete'
  594. );
  595. $r->add(
  596. $r::PST,
  597. '/admin/parser/smilies/upload',
  598. 'AdminParserSmilies:upload',
  599. 'AdminSmiliesUpload'
  600. );
  601. $r->add(
  602. $r::DUO,
  603. '/admin/categories',
  604. 'AdminCategories:view',
  605. 'AdminCategories'
  606. );
  607. $r->add(
  608. $r::DUO,
  609. '/admin/categories/{id|i:[1-9]\d*}/delete',
  610. 'AdminCategories:delete',
  611. 'AdminCategoriesDelete'
  612. );
  613. $r->add(
  614. $r::DUO,
  615. '/admin/forums',
  616. 'AdminForums:view',
  617. 'AdminForums'
  618. );
  619. $r->add(
  620. $r::DUO,
  621. '/admin/forums/new',
  622. 'AdminForums:edit',
  623. 'AdminForumsNew'
  624. );
  625. $r->add(
  626. $r::DUO,
  627. '/admin/forums/{id|i:[1-9]\d*}/edit',
  628. 'AdminForums:edit',
  629. 'AdminForumsEdit'
  630. );
  631. $r->add(
  632. $r::DUO,
  633. '/admin/forums/{id|i:[1-9]\d*}/delete',
  634. 'AdminForums:delete',
  635. 'AdminForumsDelete'
  636. );
  637. $r->add(
  638. $r::GET,
  639. '/admin/groups',
  640. 'AdminGroups:view',
  641. 'AdminGroups'
  642. );
  643. $r->add(
  644. $r::PST,
  645. '/admin/groups/default',
  646. 'AdminGroups:defaultSet',
  647. 'AdminGroupsDefault'
  648. );
  649. $r->add(
  650. $r::PST,
  651. '/admin/groups/new[/{base|i:[1-9]\d*}]',
  652. 'AdminGroups:edit',
  653. 'AdminGroupsNew'
  654. );
  655. $r->add(
  656. $r::DUO,
  657. '/admin/groups/{id|i:[1-9]\d*}/edit',
  658. 'AdminGroups:edit',
  659. 'AdminGroupsEdit'
  660. );
  661. $r->add(
  662. $r::DUO,
  663. '/admin/groups/{id|i:[1-9]\d*}/delete',
  664. 'AdminGroups:delete',
  665. 'AdminGroupsDelete'
  666. );
  667. $r->add(
  668. $r::DUO,
  669. '/admin/censoring',
  670. 'AdminCensoring:edit',
  671. 'AdminCensoring'
  672. );
  673. $r->add(
  674. $r::DUO,
  675. '/admin/maintenance',
  676. 'AdminMaintenance:view',
  677. 'AdminMaintenance'
  678. );
  679. $r->add(
  680. $r::PST,
  681. '/admin/maintenance/rebuild',
  682. 'AdminMaintenance:rebuild',
  683. 'AdminMaintenanceRebuild'
  684. );
  685. $r->add(
  686. $r::GET,
  687. '/admin/maintenance/rebuild/{token}/{clear:[01]}/{limit|i:[1-9]\d*}/{start|i:[1-9]\d*}',
  688. 'AdminMaintenance:rebuild',
  689. 'AdminRebuildIndex'
  690. );
  691. $r->add(
  692. $r::GET,
  693. '/admin/logs',
  694. 'AdminLogs:info',
  695. 'AdminLogs'
  696. );
  697. $r->add(
  698. $r::DUO,
  699. '/admin/logs/{action:\w+}/{hash}/{token}',
  700. 'AdminLogs:action',
  701. 'AdminLogsAction'
  702. );
  703. }
  704. $uri = $_SERVER['REQUEST_URI'];
  705. if (false !== ($pos = \strpos($uri, '?'))) {
  706. $uri = \substr($uri, 0, $pos);
  707. }
  708. $uri = \rawurldecode($uri);
  709. $method = $_SERVER['REQUEST_METHOD'];
  710. $route = $r->route($method, $uri);
  711. $page = null;
  712. switch ($route[0]) {
  713. case $r::OK:
  714. // ... 200 OK
  715. list($page, $action) = \explode(':', $route[1], 2);
  716. $page = $this->c->$page->$action($route[2], $method);
  717. break;
  718. case $r::NOT_FOUND:
  719. // ... 404 Not Found
  720. if (
  721. 1 !== $user->g_read_board
  722. && $user->isGuest
  723. ) {
  724. $page = $this->c->Redirect->page('Login');
  725. } else {
  726. $page = $this->c->Message->message('Not Found', true, 404);
  727. }
  728. break;
  729. case $r::METHOD_NOT_ALLOWED:
  730. // ... 405 Method Not Allowed
  731. $page = $this->c->Message->message(
  732. 'Bad request',
  733. true,
  734. 405,
  735. [
  736. ['Allow', \implode(',', $route[1])],
  737. ]
  738. );
  739. break;
  740. case $r::NOT_IMPLEMENTED:
  741. // ... 501 Not implemented
  742. $page = $this->c->Message->message('Bad request', true, 501);
  743. break;
  744. }
  745. return $page;
  746. }
  747. }