Symfony2 - управление запросом / ответом от прослушивателя исключений ядра - PullRequest
8 голосов
/ 19 сентября 2011

Я создаю панель администрирования для веб-сайта, и я хотел бы изменить представление, вызываемое, когда возникает исключение 404 , но только для приложения администратора. (path: /admin/*)

Я уже перестарался с представлением error404.html.twig (на app/Resources/TwigBundle/views/Exception/) для веб-сайта.

Я думал о слушателе события kernel.exception, но теперь я застрял в двух вещах:

  • Загрузка другого вида ошибки только тогда, когда маршрут начинается с префикса: /admin/

    $route = $event->getRequest->get('_route')->render()
    //returns NULL
    
  • Вызов функции $event->container->get('templating')->render().

Я получаю бесконечный цикл (пустую страницу), когда скрипт завершается неудачей.

Единственное, что у меня работает, это:

  • Получение кода исключения:

    $exception = $event->getException();
    $code = $exception->getCode();
    
  • Создание нового ответа:

    $response = new Response();
    $event->setResponse($response);
    

Есть предложения о том, как этого добиться?

[EDIT]

Класс:

namespace Cmt\AdminBundle\EventListener;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Bundle\TwigBundle\TwigEngine;

class AdminActionListener
{
    /**
     * @var ContainerInterface
     */
    protected $container;

    /**
     * @var TwigEngine
     */
    protected $templating;


    /**
     * @param ContainerInterface $container
     */
    public function __construct(ContainerInterface $container, TwigEngine $templating){
        // assign value(s)
        $this->container = $container;
        $this->templating = $templating;
    }

    /**
     * 
     * @param GetResponseForExceptionEvent $event
     */
    public function onKernelException(GetResponseForExceptionEvent $event)
    {
        // get exception
        $exception = $event->getException();

        // get path
        $path = $event->getRequest()->getPathInfo();

        /*
        * Redirect response to new 404 error view only
        * on path prefix /admin/ 
            */
        }
}

И services.yml:

services:
    cmt_admin.exception.action_listener:
        class: Cmt\AdminBundle\EventListener\AdminActionListener
        arguments: [@service_container] [@templating]
        tags:
            -   { name: kernel.event_listener, event: kernel.exception, method: onKernelException }

Ответы [ 2 ]

3 голосов
/ 20 сентября 2011

По какой-то причине это сработало:

// get exception
$exception = $event->getException();

// get path
$path = $event->getRequest()->getPathInfo();

if ($exception->getStatusCode() == 404 && strpos($path, '/admin') === 0){

    $templating = $this->container->get('templating');

    $response = new Response($templating->render('CmtAdminBundle:Exception:error404.html.twig', array(
        'exception' => $exception
    )));

    $event->setResponse($response);
}

Что я и делал раньше с другим синтаксисом ...

@ dmirkitanov В любом случае, спасибо за помощь!

3 голосов
/ 19 сентября 2011

Вы можете попробовать это:

public function __construct(TwigEngine $templating)
{
    $this->templating = $templating;
}

public function onKernelException(GetResponseForExceptionEvent $event)
{
    static $handling;

    $exception = $event->getException();

    if (true === $handling) {
        return;
    }
    $handling = true;

    $code = $exception->getCode();

    if (0 !== strpos($event->getRequest()->getPathInfo(), '/admin') && 404 === $code) {
        $message = $this->templating->render('AcmeBundle:Default:error404new.html.twig', array());
        $response = new Response($message, $code);
        $event->setResponse($response);
    }

    $handling = false;
}

$ переменную шаблонов можно передать в services.xml:

<service id="acme.exception.listener" class="%acme.exception.listener.class%">
    <tag name="kernel.event_listener" event="kernel.exception" method="onKernelException" />
    <argument type="service" id="templating" />
</service>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...