1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- <?php
- namespace Src;
- use FastRoute\RouteCollector;
- use FastRoute\RouteParser\Std;
- use FastRoute\DataGenerator\MarkBased;
- use FastRoute\Dispatcher\MarkBased as Dispatcher;
- use Src\Traits\SingletonTrait;
- class Middleware
- {
- //Используем трейт
- use SingletonTrait;
- private RouteCollector $middlewareCollector;
- public function add($httpMethod, string $route, array $action): void
- {
- $this->middlewareCollector->addRoute($httpMethod, $route, $action);
- }
- public function group(string $prefix, callable $callback): void
- {
- $this->middlewareCollector->addGroup($prefix, $callback);
- }
- //Конструктор скрыт. Вызывается только один раз
- private function __construct()
- {
- $this->middlewareCollector = new RouteCollector(new Std(), new MarkBased());
- }
- //Запуск всех middlewares для текущего маршрута
- public function runMiddlewares(string $httpMethod, string $uri): Request
- {
- $request = new Request();
- //Получаем список всех разрешенных классов middlewares из настроек приложения
- $routeMiddleware = app()->settings->app['routeMiddleware'];
- //Перебираем все middlewares для текущего адреса
- foreach ($this->getMiddlewaresForRoute($httpMethod, $uri) as $middleware) {
- $args = explode(':', $middleware);
- //Создаем объект и вызываем метод handle
- (new $routeMiddleware[$args[0]])->handle($request, $args[1] ?? null);
- }
- //Возвращаем итоговый request
- return $request;
- }
- //Поиск middlewares по адресу
- private function getMiddlewaresForRoute(string $httpMethod, string $uri): array
- {
- $dispatcherMiddleware = new Dispatcher($this->middlewareCollector->getData());
- return $dispatcherMiddleware->dispatch($httpMethod, $uri)[1] ?? [];
- }
- }
|