/** * Invokes associated action to the current request. * * @access private * * @param int $type request type * * @throws FrontControllerException */ protected function invokeAction($type = self::MASTER_REQUEST) { $this->dispatch('frontcontroller.request'); $request = $this->getRequest(); $controllerResolver = $this->getApplication()->getContainer()->get('controller_resolver'); $controller = $controllerResolver->getController($request); // logout Event dispatch if (null !== $request->get('logout') && true === $request->get('logout') && true === $this->getApplication()->getSecurityContext()->isGranted('IS_AUTHENTICATED_FULLY')) { $this->dispatch('frontcontroller.request.logout'); } if (null !== $controller) { $dispatcher = $this->application->getEventDispatcher(); // dispatch kernel.controller event $event = new FilterControllerEvent($this, $controller, $request, $type); $dispatcher->dispatch(KernelEvents::CONTROLLER, $event); // a listener could have changed the controller $controller = $event->getController(); $eventName = $this->getControllerActionEventName($controller[0], $request->attributes->get('_action')); $dispatcher->dispatch($eventName . '.precall', new Event\PreRequestEvent($request)); // get controller action arguments $actionArguments = $controllerResolver->getArguments($request, $controller); $response = call_user_func_array($controller, $actionArguments); if (!$response instanceof Response) { $this->application->warning(sprintf('Action %s from controller %s should return an object Response, got %s.', $request->attributes->get('_action'), get_class($controller[0]), gettype($response))); $response = new Response(); } $dispatcher->dispatch($eventName . '.postcall', new Event\PostResponseEvent($response, $request)); return $response; } else { throw new FrontControllerException(sprintf('Unknown action `%s`.', $request->attributes->get('_action')), FrontControllerException::BAD_REQUEST); } }
/** * [pushRouteCollection description]. * * @param array $routes [description] * * @return [type] [description] */ public function pushRouteCollection(array $routes) { foreach ($routes as $name => $route) { if (false === array_key_exists('pattern', $route) || false === array_key_exists('defaults', $route)) { $this->application->warning(sprintf('Unable to parse the route definition `%s`.', $name)); continue; } $this->addRoute($name, $route); } $this->moveDefaultRoute(); }
/** * Add listener to events. * * @param array $events_config */ public function addListeners(array $events_config) { foreach ($events_config as $name => $listeners) { if (false === array_key_exists('listeners', $listeners)) { $this->application->warning("None listener found for `{$name}` event."); continue; } $listeners['listeners'] = (array) $listeners['listeners']; foreach ($listeners['listeners'] as $listener) { $this->addListener($name, $listener); } } }