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

Php Symfony 4:忽略来自调试工具栏的内核事件,php,symfony,debugging,events,symfony4,Php,Symfony,Debugging,Events,Symfony4,我对Symfony很陌生,所以请原谅我,如果这对你来说很明显:) 对于我的项目,我需要根据url执行一些操作。我使用内核事件,更具体地说是内核请求 在services.yaml中: App\Service\UrlManager: tags: - { name: kernel.event_listener, event: kernel.request} 在UrlManager.php中: public function onKernelRequest(GetRespo

我对Symfony很陌生,所以请原谅我,如果这对你来说很明显:)

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

在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 :)
     */ 
但当我处于开发模式时,调试工具栏会再次触发相同的事件。。。 我找到的唯一解决办法是在治疗前添加以下内容:

if (substr($request->server->get('REQUEST_URI'),0,6) != '/_wdt/') {
也可以很好地工作,但我认为这不是最好的做法,因为一些非常具体的东西将留在项目中,并且只适用于开发模式。
有没有办法“告诉”工具栏不要触发此事件?也许可以在服务中添加一些内容。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();

}

如果(!$event->isMasterRequest())返回;将基本上过滤除初始请求之外的所有请求。并使用$request=$event->getRequest()而不是创建自己的。我已经尝试检查它是否是主请求,但我猜调试工具栏会创建自己的应用程序实例,因此事件是主请求。。。无论如何,谢谢你的请求提示!如果有人想知道:这个解决方案仍然适用于Symfony 5。谢谢你的研究。