Symfony / Doctrine 2 - 在Entity中使用config参数

时间:2012-07-15 19:16:48

标签: symfony doctrine-orm

我有一个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作为参考传递?或者我完全错了吗?

1 个答案:

答案 0 :(得分:4)

您不应该访问所有内部实体的服务容器。应该传递值本身

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

当然,我们还没有真正解决问题:参数仍然需要从某个地方的容器中取出。如果这个方法主要在控制器动作中被调用,我就不会做任何额外的工作来使事情变得更清洁,并且会在控制器动作中直接传递容器参数。

但是,如果需要在Twig模板中获得最好的员工,例如,如果没有必要传递参数那将是很好的。一种可能性是使用setter方法并将参数预先传递给从数据库中检索的每个实体。您可以在存储库或授权管理器中执行此操作。最先进的解决方案是收听postLoad事件并在event listener中传递参数。