不久之后,我开始在工作中使用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");
}
这正常吗?
答案 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.php
或module.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');
}
}