2012-07-15 105 views
0

我有一個Employee對象樹(它們是樹狀層次結構,每個人都有一個領導,所有領導都有更多的員工)。所有員工都有一個稱爲單位的整數參數。Symfony/Doctrine 2 - 在實體中使用配置參數

/** 
* @ORM\Entity 
* @ORM\Table(name="employees") 
*/ 
class Employee 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\OneToMany(targetEntity="Employee", mappedBy="leader") 
    */ 
    protected $employees; 

    /** 
    * @ORM\ManyToOne(targetEntity("Employee", inversedBy="employees") 
    */ 
    protected $leader; 
} 

我需要讓所有的員工,誰擁有最多N個單位,其中N中config.yml定義。起初,我試圖將$ configContainer推入$ GLOBALS,並在ArrayCollection :: filter()的Closure中使用它。現在,我發現了一個方法,這樣我就可以use變量在封閉:

public function getBestEmployees(&$configContainer) 
{ 
    return $this->getAllEmployees()->filter(
     function bestEmployees($employee) use ($configContainer) 
     { 
      return ($employee->getUnits() >= $configContainer->getParameter('best_unit_count')); 
     } 
    ); 
} 

現在,我不知道是否有從實體訪問的配置參數任何其他方式,或者我真的必須要通過整個configContainer作爲參考?或者我是否完全錯誤?

回答

4

您不應該訪問所有內部實體的服務容器。本身的價值應該被替代

public function getBestEmployees($bestUnitCount) 
{ 
    return $this->getAllEmployees()->filter(function ($employee) use ($bestUnitCount) { 
     return $employee->getUnits()->count() >= $bestUnitCount; 
    }); 
} 

當然過去了,我們還沒有真正解決了這個問題尚未:參數仍然需要從容器取出的地方。如果這個方法主要在控制器動作中被調用,我不會費事做任何額外的工作來使事情變得更清潔,並且會直接在控制器動作中傳遞容器參數。

但是,如果需要在Twig模板中獲得最好的員工,例如,如果不需要傳遞參數,那將會很好。一種可能性是使用setter方法並事先將參數傳遞給從數據庫中檢索的每個實體。您可以在存儲庫或實體經理中執行此操作。最先進的解決方案是聽取postLoad事件並將參數傳遞給event listener

+2

您可能還有一個EmployeeManager服務,它將注入參數和代理或裝飾方法調用。 – 2012-07-16 12:15:44

+0

EntityManager服務實際上是最乾淨的解決方案。在控制器中注入動作並不比直接注入實體好很多。 – 2015-08-20 21:47:26