4

我正在为我的 Web 项目使用 Symfony2,并且我有几个控制器具有完全相同的 try catch 块

<?php

class MyBaseController extends Controller {
    private $manager = new MyManager();
    // Some generic stuff
}

class MyController1 extends MyBaseController {
    try {
        $manager->one();        
    }
    catch (Exception $e) {
        return $this->someOtherMessage();
    }
}

class MyController2 extends MyBaseController {
    try {
        $manager->two();        
    }
    catch (Exception $e) {
        return $this->someOtherMessage();
    }
}

class MyController3 extends MyBaseController {
    try {
        $manager->three();      
    }
    catch (Exception $e) {
        return $this->someOtherMessage();
    }
}

我怎么能写这个来避免这么多重复?

4

1 回答 1

2

如果每个控制器都可能发送一个特定的异常,那么您的控制器中的每个方法都不需要 try/catch 块。
我看到两种方法来处理这个问题。

首先,如果这是一个可以抛出的全局异常,并且您只想呈现另一条消息,而不是默认的 500 错误消息。您可以通过在文件夹中创建自己的模板来覆盖给定的默认模板error500.html.twigapp/Resources

处理它的另一种方法是创建一个与事件侦听器绑定的自定义异常。
我会创建自己的异常,就像ManagerException由事件侦听器处理一样。

class ManagerException extends Exception {}

您的经理现在会抛出此异常。
注意:你可以创建任何你想要的异常,只要它扩展了这个基本异常

class RuntimeManagerException extends ManagerException {}

然后你可以声明你的事件监听器

services.yml

services:
    manager_exception.listener:
        class: Acme\FooBundle\Listener\ManagerExceptionListener
        arguments: [ @templating ]
        tags:
            -
                name: kernel.event_listener
                event: kernel.exception
                method: onKernelException

Acme\FooBundle\Listener\ManagerExceptionListener

use Symfony\Component\Templating\EngineInterface;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;

class ManagerExceptionListener
{
    protected $twig;

    public function __construct(EngineInterface $twig)
    {
        $this->twig = $twig;
    }

    public function onKernelException(GetResponseForExceptionEvent $event)
    {
        $exception = $event->getException();

        if (!($exception instanceof ManagerException)) {
            return;
        }

        $response = new Response;
        $response->setContent($this->twig->render('errorpage.html.twig'));

        $event->setResponse($response);
    }
}
于 2013-10-04T12:36:07.103 回答