ZendFramework 2 - 我 Class 中的 ServiceManager

ZendFramework 2 - ServiceManager in my Class

我开始在工作中使用Zend2没多久,我的问题 如何在我的 class "Blog" 中获取 ServiceManager。 这个class是包含

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

许多工作领域。

我在 Controllers 和没有 Controllers 的情况下都使用这个 class。 现在我创建 class

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

正常吗?

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

检索服务管理器的正确方法是在 class Blog.

中实现接口 Zend\ServiceManager\ServiceLocatorAwareInterface
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 中声明您的 class:

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

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

use Zend\Mvc\MvcEvent;

class Module {

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

}