编程语言
首页 > 编程语言> > php – Symfony 4:忽略来自调试工具栏的内核事件

php – Symfony 4:忽略来自调试工具栏的内核事件

作者:互联网

我对Symfony很新,请原谅我,如果它对你来说很明显:)

对于我的项目,我需要根据网址执行一些操作.我使用内核事件,更具体地说是内核请求.

在services.yaml中:

App\Service\UrlManager:
    tags:
        - { name: kernel.event_listener, event: kernel.request}  

在UrlManager.php中:

public function onKernelRequest(GetResponseEvent $event)
{
    $request = Request::createFromGlobals();
    $hostname = parse_url($request->server->get('HTTP_HOST'),PHP_URL_HOST);

    /*
     * here my treatment that works fine :)
     */ 

但是当我处于DEV模式时,调试工具栏会再次触发相同的事件……
我找到的唯一解决方法是在治疗前加入:

if (substr($request->server->get('REQUEST_URI'),0,6) != '/_wdt/') {

也工作正常,但我认为这不是最好的事情,因为非常具体的东西将留在项目中,并且只适用于DEV模式.
有没有办法“告诉”工具栏不要触发此事件?也许在services.yaml中添加一些东西?还是其他一些配置参数?

解决方法:

所以我做了一些研究.这不是内核事件被触发两次,而是一旦你的原始页面被发送到浏览器,一些javascript就会发起第二次_wdt请求以获取更多信息.所以你实际上有两个独立的请求.您可以通过在浏览器中按F12然后选择网络选项卡并刷新来查看此信息.

过滤调试请求很容易,因为路由的名称将始终为_wdt.您也可以直接从请求中获取主机.仍然想检查主请求,因为最终您的代码可能会触发子请求.

public function onRequest(GetResponseEvent $event)
{
    // Only master
    if (!$event->isMasterRequest()) {
        return;
    }
    $request = $event->getRequest();

    // Ignore toolbar
    if ($request->attributes->get('_route') === '_wdt') {
        return;
    }

    // Avoid parsing urls and other stuff, the request object should have
    // all the info you need
    $host = $request->getHost();

}

标签:symfony4,php,events,debugging,symfony
来源: https://codeday.me/bug/20191008/1874439.html