15

新しい PHP 5.4 traitsで Symfony 2依存性注入コンポーネントを使用する方法を見つけようとしています。

長い話を短くするために (実際にはそれほど短くはありません)、私のプロジェクトでは、すべて独自の特定のコンストラクターを持つ View クラスを分離しました。各ビューは、trait として定義されている 0 個以上のビュー ヘルパーを使用できます。

trait TranslatorHelper
{
    /**
     * @var Translator
     */
    protected $translator;

    /**
     * @param Translator $translator
     */
    protected function setTranslator(Translator $translator)
    {
        $this->translator = $translator;
    }

    /**
     * @param string $text
     * @return string
     */
    public function translate($text)
    {
        return $this->translator->translate($text);
    }
}

-

class UserEditView extends AbstractView
{
    use TranslatorHelper;

    public function __construct(User $user, UserEditForm $form)
    {
        // ...
    }
}

renderView()ビューをレンダリングする前に、ビュー クラスで使用されるすべての特性に基づいてセッター インジェクションを実行するメソッドをコントローラーに追加したいと考えています。

class Controller
{
    public function renderView(View $view)
    {
        // Check what traits are used by $view, and inject their dependencies
        // {...}


        // Then render the View
        return $view->render();
    }
}

DependencyInjectionコンポーネントでこれを行う方法について何か考えはありますか?

主な問題は、明らかにビューが DI コンテナーによって作成されず、アプリケーション フローのどこでも作成できることです。依存関係を注入する必要があるのは、それらがレンダリングされる前だけです。

最後の注意: 私は Symfony コンポーネントに縛られていません。別の DI コンテナのリードも同様に高く評価されます。

4

2 に答える 2

18

Symfony 3.3 では、自動配線サービスのアイデアが導入されました。
トレイトにセッター関数を作成し、@requiredアノテーションを追加するだけです。

private $entityManager;

/**
 * @required
 * @param EntityManagerInterface $entityManager
 */
public function setEntityManager(EntityManagerInterface $entityManager)
{
    $this->entityManager = $entityManager;
}

参照: https://symfony.com/doc/current/service_container/autowiring.html#autowiring-other-methods-eg-setters

于 2018-05-18T13:40:21.133 に答える
6

トレイトは、このように DI を行うために使用されるものではないと思います。同様のシナリオで私が行うことは、必要なサービスを直接注入するための特性を実装するビュークラスでコンストラクター注入を使用することです (または、セッターでさえも問題なく、可能であればタフなコンストラクターでさえも優れています)。

クラスによって実装された特性がアプリケーションの実行前に静的に定義されていることを考えると、動的注入を実行するために特性を検査する必要は実際にはありません。実行する前に必要なサービスがわかります。トレイトを具体的なメソッドとのインターフェースであるかのように考えてください。

于 2012-07-16T09:23:26.883 に答える