将实体管理器注入事件侦听器时出现 Symfony 3 错误

Ber*_*rdA 1 php events dependency-injection symfony doctrine-orm

我有一个事件侦听器,它设置一些会话变量,还检查访问者是否在上次访问时设置了某种类型的购物车,并在前端显示其详细信息。

该事件工作正常,直到尝试注入实体管理器,我需要在访问者实体上使用一些 setter/getter。

我也尝试过这个解决方案,但最终遇到了同样的问题,即“给出的字符串”而不是对象。

它产生的错误是:

类型错误:传递给 AppBundle\EventListener\InitializerListener::onKernelRequest() 的参数 2 必须是 Doctrine\ORM\EntityManager 的实例,给出的字符串

这是代码:]

服务.yml

  app.initializer_listener:
  class: AppBundle\EventListener\InitializerListener
  arguments: ["@doctrine.orm.entity_manager"]
  tags:
    - { name: kernel.event_listener, event: kernel.controller, method: onKernelRequest }
Run Code Online (Sandbox Code Playgroud)

AppBundle\EventListener\IniatilizerListener

namespace AppBundle\EventListener;

use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\Response;
use UsedBundle\Entity\Visitor;
use Doctrine\Common\Persistence\ManagerRegistry;
use Doctrine\ORM\EntityManager;

class InitializerListener
{
private $event;
private $em;

public function onKernelRequest( FilterControllerEvent $event, EntityManager $em )
{   
    $visitor = new Visitor();

    $this->em = $em;

    $route = $event->getRequest()->get('_route');
    if ($event->isMasterRequest() && '_wdt' !== $route ) {
        $session = $event->getRequest()->getSession();
        $cookies = $event->getRequest()->cookies;
        $this->sessionInit( $session, $cookies );
        //$this->visitorInit( $session, $cookies, $visitor );
        //$em->persist($visitor);
        //$em->flush();
    }
}

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

private function visitorInit($session, $cookies, $visitor)
{
   //visitor setup/shopping cart here
}
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*Joe 5

我认为您应该将 EntityManager 注入类而不是函数?(对 sf3 不是很熟悉,但这就是我在 sf2.8 中所做的)

class InitializerListener
{
    private $event;
    private $em;

    public function __construct(EntityManager $em) {
        $this->em = $em;
    }

    public function onKernelRequest( FilterControllerEvent $event)
    {   
       ...
    }

}
Run Code Online (Sandbox Code Playgroud)