Ejemplo n.º 1
0
 /**
  * @param Request  $request
  * @param Response $response
  * @param callable $next
  * @return Response
  */
 public function __invoke(Request $request, Response $response, callable $next)
 {
     $dispatcher = new Dispatcher($this->collector->getData());
     $result = $dispatcher->dispatch($request->getMethod(), $request->getUri()->getPath());
     $code = $result[0];
     if ($code != Dispatcher::FOUND) {
         return $next($request, $response);
     }
     /** @var Route $route */
     $route = $result[1];
     $params = $result[2];
     $request = $request->withAttribute('params', $params);
     foreach ($params as $key => $value) {
         $request[$key] = $value;
     }
     // Custom middleware handler.
     // We have to iterate through middleware as it was added so that they retain the proper ordering.
     // We have to check if the middleware is a route and if it was the route matched during dispatching.
     // If so, we can call the route handler, otherwise, we need to skip over it.
     $middleware = $this->middleware;
     $callable = function ($request, $response) use(&$callable, &$middleware, $route, $next) {
         /** @var callable $layer */
         $layer = array_shift($middleware);
         if ($layer instanceof Route) {
             if ($layer !== $route) {
                 return $callable($request, $response, $next);
             }
             $layer = $this->resolver->resolve($route->getHandler());
             return $layer($request, $response);
         }
         return $layer($request, $response, $callable);
     };
     return $callable($request, $response);
 }
Ejemplo n.º 2
0
 /**
  * @internal
  * @param Request $request
  * @param Response $response
  * @param callable $next
  * @return Response
  */
 public function dispatchHandler(Request $request, Response $response, callable $next)
 {
     $dispatcher = new Dispatcher($this->collector->getData());
     $result = $dispatcher->dispatch($request->getMethod(), $request->getUri()->getPath());
     $code = $result[0];
     $handler = isset($result[1]) ? $result[1] : null;
     $params = isset($result[2]) ? $result[2] : [];
     if ($code != Dispatcher::FOUND) {
         return $next ? $next($request, $response) : $response;
     }
     foreach ($params as $key => $value) {
         $request[$key] = $value;
     }
     return $this->paramHandler($request, $response, $next, $handler, $params);
 }