好吧我正在使用ZF2和Doctrine的ORM模块
我有一个名为ProjectGateway.php
我的问题是如何通过getServiceLocator()->
访问服务定位器我调用了未定义的类错误。
模型是否需要扩展类?我错过了一些进口产品吗?
我可以通过控制器访问它。
任何朝着正确方向发展的人都会非常感激。
答案 0 :(得分:4)
有两种方法可以做到这一点:
ServiceManager
配置中将模型添加为服务,并确保模型类实现Zend\Service\ServiceLocatorAwareInterface
类。ServiceManager
的类,通过getter / setter手动将服务管理器添加到模型中,例如。 Controller
。方法1:
// module.config.php
<?php
return array(
'service_manager' => array(
'invokables' => array(
'ProjectGateway' => 'Application\Model\ProjectGateway',
)
)
);
现在确保您的模型实现ServiceLocatorAwareInterface
及其方法:
namespace Application\Model;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class ProjectGateway implements ServiceLocatorAwareInterface
{
protected $serviceLocator;
public function setServiceLocator(ServiceLocatorInterface $serviceLocator) {
$this->serviceLocator = $serviceLocator;
}
public function getServiceLocator() {
return $this->serviceLocator;
}
}
从控制器中,您现在可以通过以下方式获取ProjectGateway
:
$projectGateway = $this->getServiceLocator->get('ProjectGateway');
因此,您现在可以通过执行以下操作在ProjectGateway
课程中使用ServiceManager:
public function someMethodInProjectGateway()
{
$serviceManager = $this->getServiceLocator();
}
更新04/06/2014:方法2:
基本上您在模型中需要的是ServiceManager
的getter / setter,如方法1所示,如下所示:
namespace Application\Model;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;
class ProjectGateway implements ServiceLocatorAwareInterface
{
protected $serviceLocator;
public function setServiceLocator(ServiceLocatorInterface $serviceLocator) {
$this->serviceLocator = $serviceLocator;
}
public function getServiceLocator() {
return $this->serviceLocator;
}
}
然后你需要在其他地方做的事情(例如Controller
)解析那里的ServiceManager
:
namespace Application\Controller;
use Zend\Mvc\Controller\AbstractActionController;
use Application\Model\ProjectGateway;
class SomeController extends AbstractActionController
{
public function someAction()
{
$model = new ProjectGateway();
// Now set the ServiceLocator in our model
$model->setServiceLocator($this->getServiceLocator());
}
}
只不过是这个。
然而,使用方法2意味着ProjectGateway
模型在您的应用程序中无法按需提供。您每次都需要实例化并设置ServiceManager
。
但是,作为最后一点,必须注意方法1的资源并不比方法2重得多,因为在第一次调用模型之前,模型没有实例化。