2

我正在尝试使用此处找到的 kernel.request 事件

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

这是代码

服务.yml

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

请求监听器.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'))));
      }
   }

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

4

2 回答 2

0

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

if ($event->getRequest()->attributes->get('_route')[0] !== '_') {
}
于 2013-09-17T11:09:29.993 回答
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'))));
        }
    }
}
于 2013-09-20T03:10:21.040 回答