Jarves\EventListener\PluginResponseListener::onKernelView PHP Метод

onKernelView() публичный Метод

public onKernelView ( GetResponseForControllerResultEvent $event )
$event Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent
    public function onKernelView(GetResponseForControllerResultEvent $event)
    {
        $data = $event->getControllerResult();
        $request = $event->getRequest();
        if (!$event->getRequest()->attributes->get('_jarves_is_plugin')) {
            //we accept only plugin responses.
            return;
        }
        $content = $request->attributes->get('_content');
        if (null !== $data) {
            if ($data instanceof PluginResponseInterface) {
                $response = $data;
            } else {
                $response = $this->pageResponseFactory->createPluginResponse($data);
            }
            //it's required to place a PluginResponseInterface as response, so
            //PluginResponseListener::onKernelResponse can correctly identify it
            //and set it as response for this plugin content, so ContentTypes\TypePlugin
            //can place the correct response at the correct position, without executing
            //the plugin twice.
            $event->setResponse($response);
        } else {
            //we hit a plugin route, but it has responsed with NULL
            //this means it is not responsible for this route/slug.
            //we need now to remove this plugin route from the route collection
            //and fire again a sub request until all plugins on this page
            //are handled. If no plugin is responsible for this url pattern
            //and the main page route is also not responsible
            //no response is set in the $event and a 404 is thrown by the HttpKernel.
            $foundRoute = false;
            $routes = $this->frontendRouteListener->getRoutes();
            foreach ($routes as $idx => $route) {
                /** @var \Symfony\Component\Routing\Route $route */
                if ($content === $route->getDefault('_content')) {
                    //remove exactly only the current plugin that was hit in this sub request
                    $routes->remove($idx);
                    $foundRoute = true;
                    break;
                }
            }
            if ($foundRoute) {
                //we've removed the route and fire now again a sub request
                $request = clone $this->pageStack->getRequest();
                $request->attributes = new ParameterBag();
                $response = $this->kernel->handle($request, HttpKernelInterface::SUB_REQUEST);
                $event->setResponse($response);
            }
            //we do not need to restore routes in the frontendRouteListener, because
            //it reload all routes on every master request
        }
    }