1

module.config.phpを使用して、Doctrine2をサービスレイヤーオブジェクトにロードしようとしています。

namespace MyApp;
'di' => array(
    'instance' => array(
        'alias' => array(
            'myapp_doctrine_em' => 'doctrine_em',
        ),
        'orm_driver_chain' => array(
            'parameters' => array(
                'drivers' => array(
                    'MyApp' => array(
                        'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
                        'namespace' => __NAMESPACE__ . '\Models\Entity',
                        'paths' => array(
                            __DIR__ . '/../src/' . __NAMESPACE__ . '/Models/Entity'
                        )
                    )
                )
            )
        ),
        'driver' => array(
            'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver',
            'namespace' => 'MyApp\Models\Entity',
            'paths' => array('module/MyApp/src/MyApp/Models/Entity')
        ),
        'MyApp\Controller\DefaultController' => array(
            'parameters' => array(
                'em' => 'myapp_doctrine_em',
            )
        ),
        'MyApp\Models\DefaultModel' => array(
            'parameters' => array(
                'em' => 'myapp_doctrine_em',
            ),
        ),
    ),
),

上記のように、コントローラーでドクトリンをインスタンス化すると機能しますが、モデルに対して同じことを実行すると機能しません。

質問:-コントローラーを介してモデルを渡すのではなく、モデルに教義エンティティマネージャーをロードするにはどうすればよいですか?

私は何が欠けていますか?

ありがとうございました!

モデルクラスをサンプルとして追加する

namespace MyApp\Models;

use Doctrine\ORM\EntityManager;

class DefaultModel {

    protected $_em;

    public function setEntityManager(EntityManager $em) {
        $this->_em = $em;
    }

    public function getEntityManager() {
        return $this->_em;
    }

}

私のコントローラーは、次のような依存性注入メソッドを使用してDefaultControllerを拡張します。

namespace MyApp\Controller;

use Zend\View\Model\ViewModel;

class MyAppController extends DefaultController {

    public function indexAction() {
        $auth = $this->getDI('MyApp\Models\AuthenticationModel');
        $auth->validate($this->getRequest()->post()->toArray());
        ...
        return new ViewModel($data);
    }

}

DefaultController:

namespace MyApp\Controller;

use Zend\Mvc\Controller\ActionController,
    Zend\View\Model\ViewModel;

class DefaultController extends ActionController {

    protected function getDI($service) {
        $di = new Zend\Di\Di();
        $im = new Zend\Di\InstanceManager();
        $di->setInstanceManager($im);
        return $di->get($service);
    }

}

認証モデル:

namespace MyApp\Models;

class AuthenticationModel extends DefaultModel {

    public function validate(array $vars) {
        ...
    }

}
4

1 に答える 1

1

最初に、DI で行うことはすべて構成する必要があることを理解する必要があります。そうしないと、インスタンス化のみが行われ、配線は行われません。つまり、新しいZend\Di\Diインスタンスを「そのまま」使用すると、そこからオブジェクトをプルできますが、依存関係は解決されません。DI を適切に構成すると、依存関係が挿入されます。

この DI 構成は、モジュール構成で提供されます。ただし、新しい DI インスタンスはこの構成を認識しません。この DI インスタンスを構成で構成するか、事前に構成された DI インスタンスを使用するかの 2 つのオプションがあります。私はあなたが今最初のオプションを達成しようとしていると言いますが、2番目のオプションははるかに簡単です.

構成された DI インスタンスは any に注入され、Zend\Mvc\Controller\ActionControllerで使用できますgetLocator()。これはインスタンスを返し、Zend\Di\LocatorデフォルトではZend\Di\Di. DI インスタンスはモジュール構成で既に構成されているため、そこからサービスをプルできます。

namespace MyApp\Controller;

use Zend\View\Model\ViewModel;

class MyAppController extends DefaultController {

    public function indexAction() {
        $auth = $this->getLocator()->get('MyApp\Models\AuthenticationModel');
        $auth->validate($this->getRequest()->post()->toArray());
        ...
        return new ViewModel($data);
    }

}

に置き換えたことに注意getDI()してくださいgetLocator()->get()MyApp\Controller\DefaultController::getDI()したがって、完全なを削除することもできますDefaultController

于 2012-04-11T20:09:07.523 に答える