如何在ZF2中将ServiceManager实例导入模型

时间:2013-09-23 14:31:58

标签: php orm zend-framework2 doctrine

好吧我正在使用ZF2和Doctrine的ORM模块

我有一个名为ProjectGateway.php

的模型

我的问题是如何通过getServiceLocator()->访问服务定位器我调用了未定义的类错误。

模型是否需要扩展类?我错过了一些进口产品吗?

我可以通过控制器访问它。

任何朝着正确方向发展的人都会非常感激。

1 个答案:

答案 0 :(得分:4)

有两种方法可以做到这一点:

  1. ServiceManager配置中将模型添加为服务,并确保模型类实现Zend\Service\ServiceLocatorAwareInterface类。
  2. 通过另一个使用ServiceManager的类,通过getter / setter手动将服务管理器添加到模型中,例如。 Controller
  3. 方法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重得多,因为在第一次调用模型之前,模型没有实例化。