0

現在、プロジェクトをsymfony2に移行しています。現在のコードベースには、データベーステーブルでルーティングを定義できるメカニズムがあります。基本的に、リクエストURLが照合される正規表現を指定し、ユーザーがリダイレクトされるURLを指定します。このリダイレクトは、404をスローする直前の「最後の手段」として機能します。このように、これらのリダイレクトは、既存のアクションに一致するURLを上書きすることはなく、404がスローされた場合にのみ、一致が遅延して行われます。

SymfonyのイベントモデルにフックしてNotFoundHttpExceptionをリッスンしてそれを正確に行う方法はありますか(たとえば、URLが正規表現に一致する場合は、404トラフではなく、301/302リダイレクトを発行します)?

4

1 に答える 1

4

このクックブックページからわかるように、例外がスローされるたびに「kernel.exception」イベントが発生します。NotFoundHttpExceptionに特定のイベントがあることはわかりませんが、すべての例外に対して独自のリスナーサービスを作成し、サービス内で例外の種類を確認して、カスタムロジックを追加することをお勧めします。

(注:これはテストしていませんが、少なくともこれをどのように実現できるかについてのアイデアが得られるはずです。)

構成

acme.exception_listener:
    class: Acme\Bundle\AcmeBundle\Listener\RedirectExceptionListener
    arguments: [@doctrine.orm.entity_manager, @logger]
    tags:
        - { name: kernel.event_listener, event: kernel.exception, method: checkRedirect }

リスナーサービス

namespace Acme\Bundle\AcmeBundle\Listener;

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\Log\LoggerInterface;
use Doctrine\ORM\EntityManager;

class RedirectExceptionListener
{
    /**
     * @var \Doctrine\ORM\EntityManager
     */
    protected $em;

    protected $logger;

    function __construct(EntityManager $em, LoggerInterface $logger)
    {
        $this->em = $em;
        $this->logger = $logger;
    }


    /**
     * @param \Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent $event
     */
    public function checkRedirect(GetResponseForExceptionEvent $event)
    {
        $exception = $event->getException();
        if ($exception instanceof NotFoundHttpException) {

            // Look for a redirect based on requested URI
            // e.g....
            $uri = $event->getRequest()->getUri();
            $redirect = $this->em->getRepository('AcmeBundle:Redirect')->findByUri($uri);
            if (!is_null($redirect)) {
                $event->setResponse(new RedirectResponse($redirect->getUri()));
            }
        }
    }
}
于 2012-11-26T12:24:39.137 に答える