2013-03-30 27 views
2

我在Symfony2項目中有一個Doctrine過濾器。我試圖設置過濾器的參數爲每個請求的某些值(從會話中獲取)。 問題是在Symfony的onKernelRequest事件之後創建了過濾器對象,所以我無法從那裏設置它。如果我嘗試將其設置成學說的postConnect事件循環依賴檢測:爲Symfony2中的每個請求設置Doctrine過濾器的參數

ServiceCircularReferenceException: Circular reference detected for service "doctrine.orm.private_entity_manager", path: "routing.loader -> assetic.asset_manager -> twig -> translator.default -> doctrine.orm.private_entity_manager -> doctrine.dbal.private_connection -> year_visibility.parameter_setter". 

的問題是,在(或者說如何)我應該設置過濾器的參數?

回答

5

您可以嘗試手動定義過濾器並同時傳遞所需的參數。

services: 
    app.filter_manager: 
     class: App\Bundle\AppBundle\Filter\FilterManager 
     arguments: [@doctrine.orm.entity_manager, @session] 
     tags: 
      - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest } 

,在過濾管理器類:

// ... 

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

// ... 

public function onKernelRequest() 
{ 
    $this->em->getConfiguration()->addFilter('filter_name', 'Filter/Class/Name/With/Ns'); 

    $filter = $this->em->getFilters()->enable('filter_name'); 
    $filter->setParameter('param_name', $this->session->get('param_name')); 
} 
+0

我認爲這是行不通的,因爲'FilterCollection'實例化Filter類而不使用服務容器。 – Florian

+0

這工作(SF 2.8和SF 3.1)。 –

2

正如在這裏看到:https://stackoverflow.com/a/14650403/244058

你可以在內核引導您的過濾器類的一個實例。 因此,您的實例將提前非常

<?php 

class MyBundle extends Bundle 
{ 
    public function boot() 
    { 
     $em = $this->container->get('doctrine.orm.default_entity_manager'); 
     $conf = $em->getConfiguration(); 
     $conf->addFilter(
      'filter_name', 
      'Doctrine\Filter\TestFilter' 
     ); 

     // either enable it here, or later in the event listener 
     $em->getFilters()->enable('filter_name'); 
    } 
} 

之後,只需添加上kernel.request偵聽kernel.event_listener並設置過濾器參數(像這樣):

<?php 

class DoctrineSqlFilterConfigurator 
{ 
    private $em; // inject the entity manager somehow (ctor is a good idea) 

    public function onKernelRequest(GetResponseEvent $event) 
    { 
     $filter = $this->em->getFilters()->enable('filter_name'); 
     $filter->setParameter('param_name', $event->getRequest()->getSession()->get('param_name')); 
    } 
} 
+0

現在的問題是,當onKernelRequest被內部子請求觸發時,它說過濾器不存在。 –

+0

它什麼時候說的?你有堆棧跟蹤嗎? – Florian

+0

Twig_Error_Runtime:在第30行的「DefaultBundle:Template:index.html.twig」中渲染模板期間拋出異常(「Filter'filter_name'不存在。」)。 –