2017-06-28 51 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