kernel.request event setResponse to RedirectResponse 不起作用


kernel.request event setResponse to RedirectResponse not working

我正在尝试使用此处找到的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'))));
      }
   }

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

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

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

这是我最终采用的解决方案。它通过确保令牌不为 null 来避免检查路由的需要。为了防止无限循环,我添加了对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'))));
        }
    }
}
相关文章:
  • 没有找到相关文章