kernel.request事件setResponse到RedirectResponse不起作用

时间:2013-09-17 04:03:54

标签: php http events symfony

我正在尝试使用找到here

的kernel.request事件

我的示例的简化版本是重定向用户,除非它们已经在重定向页面上。我看到的问题是我得到的页面没有任何样式 - 看起来我的样式和js也可能被重定向。

这是代码

services.yml

services:
    app.RequestListener:
        class: App\EventListener\RequestListener
        arguments: [ @security.context ]
        tags:
          - { name: kernel.event_listener, event: kernel.request, method: redirectUser }

requestListener.php

class requestListener
{
   public function redirectUser()
   {
      if($event->getRequest()->getPathInfo() != '/') {
         //app_frontend_home_index goes to '/'
         $event->setResponse(new RedirectResponse($this->router->generate('app_frontend_home_index')));
      }
   }
}

我也尝试了这个设置?test = dont_redirect,一旦设置了它就不应该重定向

   public function redirectUser()
   {
      if(is_null($event->getRequest()->get('test'))) {
         //app_frontend_home_index goes to '/'
         $event->setResponse(new RedirectResponse($this->router->generate('app_frontend_home_index', array('test' => 'dont_redirect'))));
      }
   }

在阅读了我提供的链接中的部分后 - 听起来这是正确使用的事件。有没有办法让它发挥作用?

2 个答案:

答案 0 :(得分:0)

在执行重定向之前,请尝试检查以下条件:

if ($event->getRequest()->attributes->get('_route')[0] !== '_') {
}

答案 1 :(得分:0)

这是我最终选择的解决方案。它通过确保令牌不为空来避免检查路由的需要。为了防止无限循环,我在检查GET参数时添加了。为了完成这个例子,我展示了如何检查用户是否已成为会员的时间比试用时间长 - 如果是这样,他们将其重定向到定价页面。

希望这证明对某人有用 - 如果有任何差距或改进空间,请随时告诉我。

public function __construct(SecurityContext $securityContext, Router $router, $trialDays)
{
    $this->securityContext = $securityContext;
    $this->router          = $router;
    $this->trialDays       = $trialDays;
}

/**
 * @param \Symfony\Component\HttpKernel\Event\GetResponseEvent $event
 */
public function checkTrial(GetResponseEvent $event)
{
    if(!is_null($this->securityContext->getToken()) &&
        ($this->securityContext->isGranted('IS_AUTHENTICATED_FULLY') || 
        $this->securityContext->isGranted('IS_AUTHENTICATED_REMEMBERED'))) {

        $memberDays = (int)$this->securityContext->getToken()->getUser()->getCreatedAt()->diff(new \DateTime)->format('%d');
        if($memberDays > $this->trialDays &&
           is_null($event->getRequest()->get('redirected'))) {

            $event->setResponse(new RedirectResponse($this->router->generate('app_frontend_pricing_index', array('redirected' => 'true'))));
        }
    }
}