2017-06-28 25 views
0

我有一个事件侦听器,它设置一些会话变量,并检查访问者是否在上次访问时设置了购物车类型并在前端显示其详细信息。将实体管理器注入事件侦听器时发生Symfony 3错误

事件工作正常,直到试图注入实体管理器,从中我需要使用Visitor实体上的一些setter/getters。

我也试过this solution但结束了与'string given'相同的问题,而不是对象。

它产生的错误是:

Type error: Argument 2 passed to AppBundle\EventListener\InitializerListener::onKernelRequest() must be an instance of Doctrine\ORM\EntityManager, string given

这是代码:]

services.yml

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

的appbundle \事件监听\ 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 
} 
} 

回答

3

我想你应该将EntityManager注入类而不是函数? (不太熟悉sf3,但这是我在sf2.8中所做的)

class InitializerListener 
{ 
    private $event; 
    private $em; 

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

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

} 
+0

你是绝对正确的。这样可行。谢谢 – BernardA

+0

一个明显的后续问题:为什么可以将FilterControllerEvent注入到函数中而不是$ em? – BernardA

+1

因为它没有被注入。这只是一个默认参数,当调用一个侦听器函数时,它总是会被EventDispatcher添加。把它看作是Dispatcher接收事件并确定应该通知哪些监听器调用给定方法的事件,并交出可能包含与该事件相关的更多数据的事件(在Doctrine生命周期事件中,例如LifecycleArgs事件对象其中包含实体)。欲了解更多信息,你应该检查https://symfony.com/doc/current/components/event_dispatcher.html#creating-and-dispatching-an-event – Joe