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.php
或 module.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');
}
}
我开始在工作中使用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.php
或 module.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');
}
}