]> git.mxchange.org Git - friendica.git/blob - src/App/Router.php
Merge pull request #6978 from annando/no-queue
[friendica.git] / src / App / Router.php
1 <?php\r
2 \r
3 namespace Friendica\App;\r
4 \r
5 \r
6 use FastRoute\DataGenerator\GroupCountBased;\r
7 use FastRoute\Dispatcher;\r
8 use FastRoute\RouteCollector;\r
9 use FastRoute\RouteParser\Std;\r
10 use Friendica\Module;\r
11 \r
12 /**\r
13  * Wrapper for FastRoute\Router\r
14  *\r
15  * This wrapper only makes use of a subset of the router features, mainly parses a route rule to return the relevant\r
16  * module class.\r
17  *\r
18  * Actual routes are defined in App->collectRoutes.\r
19  *\r
20  * @package Friendica\App\r
21  */\r
22 class Router\r
23 {\r
24         /** @var RouteCollector */\r
25         protected $routeCollector;\r
26 \r
27         /**\r
28          * Static declaration of Friendica routes.\r
29          *\r
30          * Supports:\r
31          * - Route groups\r
32          * - Variable parts\r
33          * Disregards:\r
34          * - HTTP method other than GET\r
35          * - Named parameters\r
36          *\r
37          * Handler must be the name of a class extending Friendica\BaseModule.\r
38          *\r
39          * @brief Static declaration of Friendica routes.\r
40          */\r
41         public function collectRoutes()\r
42         {\r
43                 $this->routeCollector->addRoute(['GET', 'POST'], '/itemsource[/{guid}]', Module\Itemsource::class);\r
44         }\r
45 \r
46         public function __construct(RouteCollector $routeCollector = null)\r
47         {\r
48                 if (!$routeCollector) {\r
49                         $routeCollector = new RouteCollector(new Std(), new GroupCountBased());\r
50                 }\r
51 \r
52                 $this->routeCollector = $routeCollector;\r
53         }\r
54 \r
55         public function getRouteCollector()\r
56         {\r
57                 return $this->routeCollector;\r
58         }\r
59 \r
60         /**\r
61          * Returns the relevant module class name for the given page URI or NULL if no route rule matched.\r
62          *\r
63          * @param string $cmd The path component of the request URL without the query string\r
64          * @return string|null A Friendica\BaseModule-extending class name if a route rule matched\r
65          */\r
66         public function getModuleClass($cmd)\r
67         {\r
68                 $cmd = '/' . ltrim($cmd, '/');\r
69 \r
70                 $dispatcher = new \FastRoute\Dispatcher\GroupCountBased($this->routeCollector->getData());\r
71 \r
72                 $moduleClass = null;\r
73 \r
74                 // @TODO: Enable method-specific modules\r
75                 $httpMethod = 'GET';\r
76                 $routeInfo = $dispatcher->dispatch($httpMethod, $cmd);\r
77                 if ($routeInfo[0] === Dispatcher::FOUND) {\r
78                         $moduleClass = $routeInfo[1];\r
79                 }\r
80 \r
81                 return $moduleClass;\r
82         }\r
83 }\r