php - 交响乐 4 : ignore kernel events coming from debug toolbar

标签 php symfony debugging events symfony4

我对 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();

}

关于php - 交响乐 4 : ignore kernel events coming from debug toolbar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48074428/

相关文章:

php - 如何用php Zend框架配置MySQL数据?

php - Symfony2 : Session Global variable in PHP template

symfony2 Doctrine 选择IFNULL

php - Symfony 身份验证(您不能从 EntityUserProvider 刷新用户)

javascript调试进入VM****文件如何黑箱这些文件?

c++ - 捕获安静的 NaN

php - Magento 自定义产品属性可见性

PHP:Stomp - 是否可以捕获 "send()"上的错误?

php - 如何配置 netbeans php 项目以免将所有文件复制到 var/www

javascript - Node.js 行被跳过然后被处理