event.listener检查用户设备的误区

Misunderstanding of event.listener to check user device

我已经设置了一个简单的侦听器和服务来检查用户是否在使用移动设备。我很乐意与你分享我的研究,以帮助那些不太容易理解这种方法的人。

我的目标是首先了解我的用户是否在使用移动设备

但是我一直卡在如何操作这个函数上,我真的很难理解它是如何工作的。

这是我的代码

在我的service.yml

template.loader:
      class: ST\BackofficeBundle\EventListener\DeviceListener
      tags:
        - { name: kernel.event_listener, event: kernel.exception }

我创建的用于检查用户是否使用手机的偶数侦听器

class DeviceListener
{
    public function onKernelView(getResponseForExceptionEvent $event)
    {
       $event->getRequest()->getSession()->set('mobile', true);

       $response = new Response();
       $response->setContent($event);

       $event->setResponse($response);
    }
}

是否缺少我应该在此处或在控制器中执行的任何行?

我看到 symfony doc 中有这一行 $_SERVER ($request->headers->get('User-Agent')) 我应该在我的代码中的某个地方使用它吗?

谢谢

如果您想根据 User-Agent 修改您的响应,那么我会创建一个 kernel.response 侦听器。

因此在您的 services.yml 中声明类似

template.loader:
      class: ST\BackofficeBundle\EventListener\DeviceListener
      tags:
        - { name: kernel.event_listener, event: kernel.response, method: onKernelResponse }

这样您的侦听器将在发送响应之前被调用。当然你可以根据需要修改你的回复:

public function onKernelResponse(FilterResponseEvent $event)
{
   $response = $event->getResponse();
   $request = $event->getRequest();

   if ($request->headers->get('User-Agent') == 'whatever') {
       $response->setContent('hello');
   }

   $event->setResponse($response);
}

有关内核事件的更多详细信息,请查看 this page