繁体   English   中英

symfony2:挂接到NotFoundHttpException进行重定向

[英]symfony2: hook into NotFoundHttpException for redirection

我目前正在将我们的项目迁移到symfony2。 在当前的代码库中,我们有一种机制可以让我们在数据库表中定义路由。 我们基本上指定了一个与请求URL匹配的正则表达式,并指定了用户应重定向到的URL。 这种重定向在抛出404之前是“最后的手段”。这样,这些重定向永远不会覆盖与现有操作匹配的URL,并且只有在抛出404的情况下,延迟才进行匹配。

是否有一种方法可以挂接到Symfony的事件模型中,并监听NotFoundHttpException来做到这一点(例如,如果URL匹配某些正则表达式,则发出301/302重定向,而不是让404槽通过)。

本食谱页面可以看到,每当引发异常时,都会触发“ 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()));
            }
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM