mirror of
https://github.com/filegator/filegator.git
synced 2025-08-18 16:31:18 +02:00
initial commit
This commit is contained in:
87
backend/Services/Router/Router.php
Normal file
87
backend/Services/Router/Router.php
Normal file
@@ -0,0 +1,87 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of the FileGator package.
|
||||
*
|
||||
* (c) Milos Stojanovic <alcalbg@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE file
|
||||
*/
|
||||
|
||||
namespace Filegator\Services\Router;
|
||||
|
||||
use FastRoute;
|
||||
use Filegator\Container\Container;
|
||||
use Filegator\Kernel\Request;
|
||||
use Filegator\Services\Auth\AuthInterface;
|
||||
use Filegator\Services\Service;
|
||||
|
||||
/**
|
||||
* Uses unique query parameter to pass the route info
|
||||
* Does not require rewrite rules, .htaccess or similar.
|
||||
*
|
||||
* Example routes:
|
||||
*
|
||||
* http://example.com/?r=/some/route¶m1=val1¶m2=val2
|
||||
* http://example.com/?r=/user/{user_id}¶m1=val1
|
||||
*/
|
||||
class Router implements Service
|
||||
{
|
||||
protected $request;
|
||||
|
||||
protected $auth;
|
||||
|
||||
protected $container;
|
||||
|
||||
public function __construct(Request $request, AuthInterface $auth, Container $container)
|
||||
{
|
||||
$this->request = $request;
|
||||
$this->container = $container;
|
||||
$this->user = $auth->user() ?: $auth->getGuest();
|
||||
}
|
||||
|
||||
public function init(array $config = [])
|
||||
{
|
||||
$uri = '/';
|
||||
$http_method = $this->request->getMethod();
|
||||
|
||||
if ($r = $this->request->query->get($config['query_param'])) {
|
||||
$this->request->query->remove($config['query_param']);
|
||||
$uri = rawurldecode($r);
|
||||
}
|
||||
|
||||
$routes = require $config['routes_file'];
|
||||
|
||||
$dispatcher = FastRoute\simpleDispatcher(function (FastRoute\RouteCollector $r) use ($routes) {
|
||||
if ($routes && ! empty($routes)) {
|
||||
foreach ($routes as $params) {
|
||||
if ($this->user->hasRole($params['roles']) && $this->user->hasPermissions($params['permissions'])) {
|
||||
$r->addRoute($params['route'][0], $params['route'][1], $params['route'][2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$routeInfo = $dispatcher->dispatch($http_method, $uri);
|
||||
|
||||
$controller = '\Filegator\Controllers\ErrorController';
|
||||
$action = 'notFound';
|
||||
$params = [];
|
||||
|
||||
switch ($routeInfo[0]) {
|
||||
case FastRoute\Dispatcher::FOUND:
|
||||
$handler = explode('@', $routeInfo[1]);
|
||||
$controller = $handler[0];
|
||||
$action = $handler[1];
|
||||
$params = $routeInfo[2];
|
||||
|
||||
break;
|
||||
case FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
|
||||
$action = 'methodNotAllowed';
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
$this->container->call([$controller, $action], $params);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user