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 ブロックは必要ありません。
これを処理するには2つの方法があります。

まず、これがスローされる可能性のあるグローバルな例外であり、デフォルトの 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 に答える