2016-07-06 2 views
2

私はDependency injection with custom Doctrine 2 hydratorとほとんど同じ問題がありますが、カスタムのデータ型にハイドレーターではなくサービスを注入する必要があります。カスタムDoctrine 2データ型の依存性注入

参照される質問の解決策は、Doctrineがクラス自体を初期化するため、ドクトリンソースコードの複製と変更に依存しています。うまくいえば、カスタムデータ型には別のアプローチがありますか?

これは、Symfony3アプリケーション用です。そこに適用する魔法がいくつかあるかもしれません。最初の質問にコメントパー

+0

Doctrineがカスタムデータ型をどのようにインスタンス化するかは、これを難しくしています。 doctrineの 'Type :: addType($ name、$ className)'メソッドは、クラスのインスタンスではなくクラス名を要求します。あなたができることはバンドル拡張クラス内に独自のdoctrine型を追加し、必要な依存関係を持つ 'kernel.request'にイベントリスナーサービスを登録し、' \ Doctrine \ DBAL \ Types :: getType($ name) - > setSomeDependency($ dependency); '。しかし、かなり厄介です。 – ChadSikorra

+1

@ChadSikorraこれは、[ここ]のアプローチ(http://php-and-symfony.matthiasnoback.nl/2012/09/symfony2-mongodb-odm-creating-custom-types-with-dependencies/)に似ています。質問を投稿した直後に、イベントリスナーなしで見つかりました。私は今これを実験しており、有望だと思われます。あなたのコメントを回答として追加し、私はそれを受け入れます。 – bblue

答えて

1

:このハードを作る何

はDoctrineは、カスタムデータ型をインスタンス化する方法です。 doctrineのメソッドType::addType($name, $className)は、クラスのインスタンスではなく、クラス名を必要としています。あなたのバンドルエクステンションクラス内に独自のdoctrine型を追加し、kernel.requestに必要な依存関係を持つイベントリスナーサービスを登録し、\Doctrine\DBAL\Types::getType($name)->setSomeDependency($dependency);を呼び出してデータ型に設定します。しかし、かなり厄介です。

マティアスの記事をよく読んでください。拡張クラスのboot()メソッドは、依存関係を設定するより自然な場所のように見えます。