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