标签:
先标记觉得以后会用到的内容:
// add route to the request‘s attributes in case a middleware or handler needs access to the route $request = $request->withAttribute(‘route‘, $route);
或许以后可以在Middleware中拿到route做些其他的事情。
上篇已经分析到route是在APP的__invoke()中被调用的,这里来看看怎么匹配route的。大概的调用过程如下:
if ($routeInfo[0] === Dispatcher::FOUND) { $route = $router->lookupRoute($routeInfo[1]); return $route->run($request, $response); } elseif ($routeInfo[0] === Dispatcher::METHOD_NOT_ALLOWED) { if (!$this->container->has(‘notAllowedHandler‘)) { throw new MethodNotAllowedException($request, $response, $routeInfo[1]); } /** @var callable $notAllowedHandler */ $notAllowedHandler = $this->container->get(‘notAllowedHandler‘); return $notAllowedHandler($request, $response, $routeInfo[1]); }
$route = $router->lookupRoute($routeInfo[1]); 通过route的identify找到route。
route->run执行route。
run的结果最后就是执行自己的__invoke,从所有的middleware开始执行,栈的最后一个元素是自己。
/** * Dispatch route callable against current Request and Response objects * * This method invokes the route object‘s callable. If middleware is * registered for the route, each callable middleware is invoked in * the order specified. * * @param ServerRequestInterface $request The current Request object * @param ResponseInterface $response The current Response object * @return \Psr\Http\Message\ResponseInterface * @throws \Exception if the route callable throws an exception */ public function __invoke(ServerRequestInterface $request, ResponseInterface $response) { //debug_print_backtrace(); $this->callable = $this->resolveCallable($this->callable); /** @var InvocationStrategyInterface $handler */ $handler = isset($this->container) ? $this->container->get(‘foundHandler‘) : new RequestResponse(); // invoke route callable if ($this->outputBuffering === false) { $newResponse = $handler($this->callable, $request, $response, $this->arguments); } else { try { ob_start(); $newResponse = $handler($this->callable, $request, $response, $this->arguments); $output = ob_get_clean(); } catch (Exception $e) { ob_end_clean(); throw $e; } } if ($newResponse instanceof ResponseInterface) { // if route callback returns a ResponseInterface, then use it $response = $newResponse; } elseif (is_string($newResponse)) { // if route callback returns a string, then append it to the response if ($response->getBody()->isWritable()) { $response->getBody()->write($newResponse); } } if (!empty($output) && $response->getBody()->isWritable()) { if ($this->outputBuffering === ‘prepend‘) { // prepend output buffer content $body = new Http\Body(fopen(‘php://temp‘, ‘r+‘)); $body->write($output . $response->getBody()); $response = $response->withBody($body); } elseif ($this->outputBuffering === ‘append‘) { // append output buffer content $response->getBody()->write($output); } } return $response; }
学习Slim Framework for PHP v3 (六)--route怎么被匹配的?
标签:
原文地址:http://www.cnblogs.com/lmenglliren89php/p/5164378.html