symfony2:如何从自定义事件侦听器重定向

时间:2015-03-22 15:51:09

标签: php symfony events redirect event-listener

我已经构建了一个自定义事件监听器,在symfony2中监听自定义事件。

此事件没有setResponse方法,也没有访问请求,所以我很难从我的事件监听器执行重定向。

我们可以做到这一点的方式是什么?我应该在活动中添加一些内容以使其能够修改响应吗?有没有办法直接在侦听器中执行重定向?

谢谢!

1 个答案:

答案 0 :(得分:0)

好的,为了记录,我选择了一个涉及自定义登录处理程序和一个单独的事件监听器的解决方案,两者都将控制器参数作为一个类,我将逻辑放在一个类中,并返回一个值,指示方向是否应该发生或不。此值由执行重定向的处理程序处理,或由eventListener用于修改事件,然后由执行重定向的控制器读取该事件。

至于如何从事件监听器中重定向,我听说这是不好的做法。

因此对于eventlistener:

在我的控制器中:

            $event = new PortfolioChangeEvent();
            $this->get('event_dispatcher')->dispatch(FoodMeUpEvents::PORFOLIO_CHANGE, $event);
            if ($event->getRedirect()) return $this->redirectToRoute('cms', array('dir' => 'general', 'page' => 'foodmeup_premium'));

在我的eventlistener中:

public function onPortfolioUserChange(PortfolioChangeEvent $event)
{
      $event->setRedirect(true);
}

和我的活动:

<?php

namespace AppBundle\Event;

use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\EventDispatcher\Event;

class PortfolioChangeEvent extends Event
{
    /**
     * @Assert\Type(type="bool")
     */
    private $redirect = false;

    public function getRedirect()
    {
        return $this->redirect;
    }

    public function setRedirect($redirect)
    {
        $this->redirect = $redirect;

        return $this;
    }
}