2

私はZendFramework 2とDIのアイデア全体に不慣れです。

ここに私が達成する必要があるものがあります:

  1. 単一の AbstractModel を拡張する多数の Model クラスを作成する
  2. 依存関係のある DI を使用してその AbstractModel を提供します (私の場合は教義エンティティ マネージャー)
  3. 通常のクラスとして必要な場所で祖先クラスを使用する

3. をよりよく説明するために、次の例を見てみましょう。

class Ancestor extends Parent { }

コントローラー内、または理想的にはどこでも:

$ancestor = new Ancestor();
$ancestor->doStuffWithEntityManager();

祖先を初期化すると、注入されたリソースをすでに認識している必要があります。

これは可能ですか?デフォルトの形式で使用しない場合は、すべての祖先を指定する必要がない限り、一部のサービス マネージャーなどを介して祖先を初期化しても問題ありません。zend に伝える必要があります: X を拡張/実装するすべてのクラスにこれとあれを注入します。

何か案は?

PS: 私が言ったように、私はまったく新しいので、サンプル コードの各部分を追加する必要がある構成/クラス ファイルを指定してください。

4

3 に答える 3

6

私のアーキテクチャでは、次のようにします。最初: サービスを作成します。

class Module 
{
    public function getServiceConfig()
    {
        return array(
            'factories' => array(
                'my-service-name'   => 'MyNamespace\Factory\MyServiceFactory'
            )
        );
    }
}

次に、ServiceFactory を作成します。これは、すべての依存関係が処理されるポイントになります。

<?php
namespace MyNamespace\Factory;

use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\FactoryInterface;
use MyNamespace\Service\SomeService;

class MyServiceFactory implements FactoryInterface
{
    /**
     * Create service
     *
     * @param ServiceLocatorInterface $serviceLocator
     * @return \MyNamespace\Service\SomeService
     */
    public function createService(ServiceLocatorInterface $serviceLocator)
    {
        $service = new SomeService();
        $service->setEntityManager($serviceLocator->get('Doctrine\ORM\EntityManager'));
        return $service;
    }
}

MyService-Class はモードの依存関係を持つこともできます。私の場合は、実装されているインターフェイスのために自動的に挿入されます。ここで例を見ることができます特定の EntityService は、この例のようにリポジトリを定義する関数を 1 つだけ必要とします。

また、 Rob Allens の ServiceManager Configuration Keys の紹介 を読むことをお勧めします。特に「初期化子」セクションについて読んでください。これがあなたの質問の主な関心事だと思いますか?

これであなたの質問がカバーされることを願っています。

于 2012-11-16T09:22:31.330 に答える
1

カスタムリポジトリクラスを作成するエンティティマネージャーを注入し、find* メソッド呼び出しをオーバーライドして注入できます

Doctrine 2.0 エンティティ内で EntityManager を使用する

ただし、エンティティからデータベースへの通常の呼び出しではないため、設計を確認することをお勧めします

于 2012-11-16T09:08:52.063 に答える
-1
class Parent {
    private $em;

    public function __construct(\Doctrine\ORM\EntityManager $em) {
        $this->em = $em;
    }
}

class Ancestor extends Parent { }

// To use, create an EntityManager $em

$ancestor = new Ancestor($em);
$ancestor->doStuffWithEntityManager(); // Uses $this->em internally

依存性注入については、これで全部です。http://fabien.potencier.org/article/11/what-is-dependency-injectionも参照してください。

ZF2 での EntityManager の取得/作成については、こちらを確認してください: http://samminds.com/2012/07/a-blog-application-part-1-working-with-doctrine-2-in-zend-framework-2/

基本的に、から拡張されたコントローラーで次のAbstractActionControllerことができます。

$this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
于 2012-11-16T08:25:17.223 に答える