【问题标题】:Handling the same try catch structure in every controller在每个控制器中处理相同的 try catch 结构
【发布时间】:2013-10-11 10:30:47
【问题描述】:

我在我的 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();
    }
}

我怎样才能写这个以避免如此多的重复?

【问题讨论】:

  • 它们只是不同的方法

标签: php exception symfony exception-handling


【解决方案1】:

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

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

另一种处理方法是创建一个与event listener 绑定的自定义异常。
我会创建自己的异常,例如 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);
    }
}

【讨论】:

  • services.yml 文件对吗?通常我从服务中看到具有 2 级缩进的“类”、“参数”和“标签”......
猜你喜欢
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 2022-01-25
  • 2012-08-25
相关资源
最近更新 更多