0

私はEmployeeオブジェクトのツリーを持っています(それらはツリーのような階層にあり、全員が1人のリーダーを持ち、すべてのリーダーがより多くの従業員を持っています)。すべての従業員には、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がで定義されている最大Nユニットを持つすべての従業員を取得する必要がありconfig.ymlます。最初は、$configContainerを$GLOBALSにプッシュして、ArrayCollection :: filter()のClosureで使用しようとしていました。これでメソッドが見つかったのでuse、Closureで変数を指定できます。

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テンプレートで最高の従業員を取得する必要がある場合は、パラメーターを渡す必要がない場合に便利です。1つの可能性は、setterメソッドを使用し、データベースから取得されるすべてのエンティティに事前にパラメーターを渡すことです。これは、リポジトリまたはエンティティマネージャのいずれかで行うことができます。最も高度な解決策は、イベントをリッスンし、イベントリスナーpostLoadにパラメーターを渡すことです。

于 2012-07-15T20:29:49.623 に答える