【问题标题】:symfony 3 unexpected result with master request on servicesymfony 3 意外结果,主请求服务
【发布时间】:2017-11-20 06:24:27
【问题描述】:

我正在设置一个服务以在控制器之前运行以初始化一些服务器变量。

这个服务应该只在它是主请求时才运行,我认为这应该只是一个页面请求。

到目前为止,我设法让它运行起来,但它似乎没有给出预期的结果。如果它是主请求,它似乎运行了几次,否则只运行一次。当然,我可能只是误读了。

在下面的代码中,下面的行应该标识主请求:

($this->stack->getParentRequest() == null)

那么下面的 session['page_ct'] 对于每个新页面都应该增加 1,但它会增加 2。如果我将代码更改为 != null,它只会增加 1。

($this->session->has('page_ct') ? $this->session->set('page_ct', $this->session->get('page_ct') + 1 ): $this ->session->set('page_ct', 1 ));

这是设置:

app/config/services.yml

services:
app.initializer_listener:
  class: AppBundle\EventListener\InitializerListener
  arguments: ['@session','@request_stack']
  tags:
    - { name: kernel.event_listener, event: kernel.controller, method: InitializerAction }

和初始化器(仅骨架代码);

/src/AppBundle/EventListener/InitializerListener.php

namespace AppBundle\EventListener;

use Symfony\Bundle\FrameworkBundle\Routing\Router;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;

class InitializerListener
{
private $session;
private $event;
private $stack;

public function __construct(Session $session, RequestStack $requestStack )
{
        $this->session = $session;
        $this->stack = $requestStack;
}

public function InitializerAction(){
    if ($this->stack->getParentRequest() == null) { ********
        $this->sessionInit();
    }
}

private function sessionInit ()
{
    $this->session->set('active', time() );
    ($this->session->has('page_ct') ? $this->session->set('page_ct', $this->session->get('page_ct') + 1 ): $this->session->set('page_ct', 1 ));     
}


}

【问题讨论】:

  • 你的问题是?
  • @hakre。为了您的利益,我将重复一遍:然后,对于每个新页面,下面的 session['page_ct'] 应该增加 1,但它会增加 2。如果我将代码更改为 != null,它只会增加 1。
  • 那不是问题,那是描述。你的问题是什么?如何确定一个请求是主请求?或者:主请求是否构造了所有允许决定每个请求的单个操作的属性?
  • 您似乎从根本上误解了听众的使用。尝试让文档中的那个工作,然后调整它。调用某种初始化的东西是没有意义的。
  • 你应该有一个 onController(FilterControllerEvent $event) 而不是你的初始化方法

标签: php symfony session request


【解决方案1】:

这只是为了在@Cerad cmets 和@lordrhodos 输入之后包含最终代码以供他人使用。

app/config/services.yml

services:
app.initializer_listener:
  class: AppBundle\EventListener\InitializerListener
  tags:
    - { name: kernel.event_listener, event: kernel.controller, method: onKernelRequest }

/src/AppBundle/EventListener/InitializerListener.php

namespace AppBundle\EventListener;


use Symfony\Component\HttpKernel\Event\FilterControllerEvent;


class InitializerListener
{

public $event;

public function onKernelRequest( FilterControllerEvent  $event )
{
        $route = $event->getRequest()->get('_route');
        if ($event->isMasterRequest() && '_wdt' !== $route ) {
            $session = $event->getRequest()->getSession();
            $this->sessionInit($session);
        }
}

private function sessionInit($session)
{
    $session->set('active', time() );
    $session->has('page_ct') ? $session->set('page_ct', $session->get('page_ct') + 1 ): $session->set('page_ct', 1 );
}
}

【讨论】:

    【解决方案2】:

    这里有几个问题。

    首先,请尝试在 prod 环境中测试您的代码。我认为您的侦听器被调用了两次,因为在 dev 环境中使用活动的 Web 调试工具栏 (WDT) 运行代码。工具栏引发第二个有效的主请求。

    我强烈推荐阅读relevant documentation about controller events。你的 InitializerAction() 缺少传递的事件,所以我猜你错过了那部分。没有理由将请求堆栈注入侦听器。您可以通过$event->getRequest()$event 访问请求对象。这就是@Cerad 所说的。

    有几种方法可以排除 WDT 请求,我不确定我的方法是否最好,但您可以检查路由并将其排除:

    public function InitializerAction(FilterControllerEvent $event)
    {
        $route = $event->getRequest()->get('_route');
        if ($event->isMasterRequest() && '_wdt' !== $route) {
            $this->sessionInit();
        }
    }
    

    【讨论】:

    • 谢谢@lordrhodos。问题实际上是 WDT。我在 prod 上尝试过,但也使用上面的代码,它按预期工作。事实上,这两个代码,即我上面的原始代码和使用 FilterControllerEvent,一旦排除了额外的 WDT 的主请求,就完成了任务,我确实知道它存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多