ZendFramework 2-我班上的ServiceManager

时间:2018-08-11 10:01:48

标签: php zend-framework2

不久之后,我开始在工作中使用Zend2,我的问题是 如何在我的类“博客”中获取ServiceManager。 此类包含

$this->db 
$this->logger 
$this->logger_error
$this->session
$this->filter
$this->access
$this->view 
$this->user 
$this->base_url 

许多工作领域。

我在Controllers中使用此类,而没有Controller。 现在我创建课程

class Application extends Zend\Mvc\Application
{

    static public function init()
    {
        return \Zend\Mvc\Application::init(include 'config/application.config.php');
    }
}

并将其用于初始化

class Blog
{
     /**
      *  
      * @var Doctrine\DBAL\Connection 
      */
    protected $db;
    /** 
     *
     * @var Zend\Log\Logger
     */
    protected $logger;
    /** 
     *
     * @var Zend\Log\Logger
     */
    protected $logger_error;
    /**             
     *
     * @var Variable
     */
    protected $variable;
     /**
     *
     * @var \Zend\Cache\Storage\Adapter\Filesystem
     */
    protected $cache;
    /**
     *
     * @var \Zend\Session\Container
     */
    protected $session;

    function __construct()
    {
         $sm = Application::init()->getServiceManager();


        $this->db =  $sm->get('db');
        $this->logger = $sm->get("logger");
        $this->logger_error = $sm->get("logger_error");
        $this->variable = $sm->get("variable");
        $this->cache = $sm->get("cache");
        $this->session = $sm->get("session");
    }

这正常吗?

1 个答案:

答案 0 :(得分:1)

我会说这不是正确的解决方案。

检索服务管理器的正确方法是在类Zend\ServiceManager\ServiceLocatorAwareInterface中实现接口Blog

use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class Blog implements ServiceLocatorAwareInterface {

    protected $serviceLocator;

    public function getServiceLocator() {
        return $this->serviceLocator;
    }

    public function setServiceLocator(ServiceLocatorInterface $serviceLocator) {
        $this->serviceLocator = $serviceLocator;
    }

}

然后,您必须通过服务管理器检索此调用,就像在控制器中一样:

$blog = $this->getServiceLocator()->get('namespace\of\Blog');

最后,在配置文件(Module.phpmodule.config.php中,您声明您的类:

// ...
'service_manager' => array(
    'invokables' => array(
        'namespace\of\Blog' => 'namespace\of\Blog'
    )
),
// ...

如果您在无法访问服务管理器的地方需要此类,那么您在错误的位置创建了此类。 查看在您的课程中检索的不同组件(数据库,日志,缓存,会话),您将在该课程中做很多事情。 我建议将此逻辑拆分为不同的类,并在模块的boostrap中实例化它们:

use Zend\Mvc\MvcEvent;

class Module {

    public function onBootstrap(MvcEvent $event) {
        $serviceManager =$event->getApplication()->getServiceManager();
        $blog = $serviceManager->get('namespace\of\Blog');
    }

}