2016-05-12 13 views
1

私はクラス(FOSUserBundle)を拡張しましたが、symfonyエンティティからロジックを分離するベストプラクティスに従い、インスタンス化、オブジェクト操作などを処理する "ロジック"サービスを作成しました。拡張Symfonyエンティティロジックを格納する場所

エンティティ、タイプヒント、サービスのPHPdoc戻りオブジェクトタイプなどをすべて拡張して、すべてスーパークラスを参照し、新しく拡張されたサブクラスエンティティを参照しないときに問題が発生します。今、新しい拡張されたエンティティを処理するための新しいロジック(およびサービス)を作成する必要があります。

拡張クラスごとにこのサービス/エンティティロジックを書き直したくないです(これは悪い習慣と思われます)。作成される拡張エンティティを処理するために拡張できるスーパーサービスクラスを持つことが理想的です。

私の質問は:#1:拡張エンティティを処理するロジッククラス/サービスを作成するためのベストプラクティスは何ですか?

私の質問には次のようなものがあります:#2:symfonyのベストプラクティスを理解したいと自分自身のような人々のために、私はsymfonyのウェブサイトのベストプラクティスが優れた入門書であることを発見しましたが、中級/上級のベストプラクティスについては欠けています。

私はこの1つの答えを見つけることを楽しみにして、私は、拡張エンティティロジックが含まれているサービスクラスを拡張することによってこの問題を解決してきたあなたは

+0

:基本サービスクラスは次のように見えますが

class PersonManager extends BasePersonManager { public function __construct(EntityManager $em, EventDispatcherInterface $dispatcher) { $this->em = $em; $this->repo = $this->em->getRepository('TwenchaBundle:person'); $this->dispatcher = $dispatcher; } public function createNew() { return new person(); } } 

あなたの質問を得る!あなたは何を伸ばしたいのですか?サービスまたはエンティティ?しかし、私が理解する限り、私のアドバイスは、*延長しない*でしょう。インターフェイスと注入を使用してください。 – Yoshi

+0

こんにちは、エンティティを拡張しています。しかし、エンティティが拡張されたときに問題が発生し、サービスコードがエンティティsuperClassを参照するため、エンティティロジックを処理する古いサービスを使用できなくなります。 –

+0

なぜこれは使用できなくなりますか?スーパークラスの型ヒントは、拡張クラスを受け入れます。 https://3v4l.org/pqfKZ – Yoshi

答えて

0

:-)提供することができます任意の助けに感謝しています2つのメソッドをオーバーライドします(コンストラクタと新しく作成されたメソッドで、現在は "new className"行のみが格納されています)。これにより、サービスメソッドをオーバーライドして使用されるリポジトリを(サブクラスに)変更することができるので、そのエンティティのリポジトリnewを使用する他のすべてのサービスメソッドは、拡張エンティティのリポジトリを参照します。 「new className()」と「new extendedClassName()」を含むメソッドをオーバーライドすると、ファクトリメソッドを使用することもできます。

コードはすばらしく、私はこのものを再利用することができます!

サブエンティティ固有のメソッドとクラスoveriddesが含まれているサブクラス化サービスは、次のようになります。私は本当にない

class BasePersonManager 
{ 
    protected $em; 
    protected $repo; 
    protected $dispatcher; 

    public function __construct(EntityManager $em, EventDispatcherInterface $dispatcher) 
    { 
     $this->em   = $em; 
     $this->repo   = $this->em->getRepository('PersonBundle:BasePerson'); 
     $this->dispatcher = $dispatcher; 
    } 

    public function createNew() { 
     return new BasePerson(); 
    } 
... 
+0

あなたが満足している解決策を見つけたことを嬉しく思います。エンティティ・リポジトリ・クラス自体を拡張し、createNew文を追加できますか?また、リポジトリをサービスとして定義し、おそらくem-> getRepository呼び出しを取り除くことができることを認識していますか? – Cerad

+0

Cheers Cerad、#1:サービスにレポを移して注入するのは興味深い考えです。EntityManagerサービス(保護された$ emも削除できます)に知識/依存関係を持たせる必要はありません。これを行う理由が他にありますか? create()メソッドについては、#2:これはフェンス上にあります。私はレポがオブジェクト/エンティティをインスタンス化するよりもクエリ用に設計されていると思いましたか? –

関連する問題