0

我有一个 Employee 对象树(它们处于树状层次结构中,每个人都有一个领导,所有领导都有更多的员工)。所有员工都有一个称为单位的整数参数。

/**
 * @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() 的闭包中使用它。现在我找到了一个方法,所以我可以use在闭包中变量:

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

现在我想知道是否有任何其他方法可以从实体访问配置参数,还是我真的必须将整个 configContainer 作为参考传递?还是我做错了?

4

1 回答 1

4

您根本不应该在实体内部访问服务容器。值本身应该被传递

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

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

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

于 2012-07-15T20:29:49.623 回答