我正在尝试使用module.config.php将doctrine 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',
),
),
),
),
如上所示,当我在控制器中实例化学说时,它确实有效,但是当对我的模型做同样的事情时,却没有。
问题: - 我如何继续在我的模型中加载doctrine实体管理器,而不是通过控制器传递它们?
我错过了什么?
谢谢!
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;
}
}
My Controller使用依赖注入方法扩展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) {
...
}
}
答案 0 :(得分: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
。