/** * Dispatches the processed request. * * @param Request $request Router Request object. * @param Routes $routes Router Routes object. * * @access public * @throws \InvalidArgumentException Request token does not match. * * @return void */ public function dispatch(Request &$request, Routes &$routes) { $this->routes = $routes; $this->request = $request; $this->response = new Response(); if (Core\Session()->get('_token')) { $this->request->setToken(Core\Session()->get('_token')); } else { $this->request->regenerateToken(); Core\Session()->set('_token', $this->request->token()); } if (!$request->isValid()) { $this->response->setHttpResponseCode(403); throw new \InvalidArgumentException('Request token does not match.'); } $namespace = $request->mode('namespace'); $controller = "\\{$namespace}\\Controllers\\" . $request->controller(); if (class_exists($controller)) { $controller = new $controller(); $action = $request->action(); /* Check if there is such action implemented and filter for magic methods like __construct, etc. */ if (is_callable(array($controller, $action)) && false === strpos($action, '__')) { $controller->__executeAction($action, $request); } else { $controller->__executeAction('actionNotFound', $request); } $this->response->setContent($controller->renderer->getOutput()); $this->response->addHeader('Content-Type: ' . $controller->renderer->getOutputContentType()); } else { Core\Base\Controller::resourceNotFound($request); } }