我有一个Employee对象树(它们是树状的层次结构,每个人都有一个领导者,所有领导者都有更多的员工)。所有Employees都有一个名为units的整数参数。
/**
* @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个单位的员工在config.yml
中定义N.起初,我试图将$ 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作为参考传递?或者我完全错了吗?
答案 0 :(得分:4)
您不应该访问所有内部实体的服务容器。应该传递值本身
public function getBestEmployees($bestUnitCount)
{
return $this->getAllEmployees()->filter(function ($employee) use ($bestUnitCount) {
return $employee->getUnits()->count() >= $bestUnitCount;
});
}
当然,我们还没有真正解决问题:参数仍然需要从某个地方的容器中取出。如果这个方法主要在控制器动作中被调用,我就不会做任何额外的工作来使事情变得更清洁,并且会在控制器动作中直接传递容器参数。
但是,如果需要在Twig模板中获得最好的员工,例如,如果没有必要传递参数那将是很好的。一种可能性是使用setter方法并将参数预先传递给从数据库中检索的每个实体。您可以在存储库或授权管理器中执行此操作。最先进的解决方案是收听postLoad
事件并在event listener中传递参数。