1

我正在尝试使用 module.config.php 将教义 2 加载到我的服务层对象中:

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);
    }

}

默认控制器:

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 实例。我想说你现在正在尝试完成第一个,而第二个选项要容易得多。

已配置的 DI 实例被注入到任何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 回答