我有一个班级:ClassA()
,我需要教义服务$this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
。
我尝试实现接口ServiceManagerAwareInterface
,但函数getServiceLocator()
和setServiceLocator(ServiceLocatorInterface $serviceLocator)
不起作用。
有人在ZF2中使用了Controller类外的ServiceLocator吗?有可能吗?
<?php
namespace DbSession\Service;
use Zend\Session\SaveHandler\SaveHandlerInterface;
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorAwareTrait;
/**
* Description of SessionDB
*
* @author rab
*/
class SessionDB implements SaveHandlerInterface, ServiceLocatorAwareInterface {
use ServiceLocatorAwareTrait;
/**
* Session Save Path
*
* @var string
*/
protected $sessionSavePath;
/**
* Session Name
*
* @var string
*/
protected $sessionName;
/**
* Lifetime
* @var int
*/
protected $lifetime;
/**
* Constructor
*
*/
public function __construct() {
}
/**
* Open the session
*
* @return bool
*/
public function open($savePath, $name) {
echo "open session";
}
/**
* Close the session
*
* @return bool
*/
public function close() {
echo "close session";
}
/**
* Read the session
*
* @param int session id
* @return string string of the sessoin
*/
public function read($id) {
echo "read session";
}
/**
* Write the session
*
* @param int session id
* @param string data of the session
*/
public function write($id, $data) {
$this->getServiceLocator()->get('');
echo "write";
}
/**
* Destoroy the session
*
* @param int session id
* @return bool
*/
public function destroy($id) {
echo "destroy session";
}
/**
* Garbage Collector
*
* @param int life time (sec.)
* @return bool
*/
public function gc($maxlifetime) {
echo "gc session";
}
}
答案 0 :(得分:0)
最简单的方法是使用ServiceLocatorAwareTrait(ZF2的一部分)。如果您确实使用它,请确保您的类实现ServiceLocatorAwareInterface(您实际上不必实现它,因为特性为您执行,但您必须将它添加到您的类&#39; implements子句)。
所以你得到这样的东西:
use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorAwareTrait;
class ClassA implements ServiceLocatorAwareInterface {
use ServiceLocatorAwareTrait;
}
然后你可以调用$ this-&gt; getServiceLocator()来获取servicelocator实例。
但是,如果您只需要Doctrine实体管理器,那么只需注入一个依赖项而不是注入ServiceLocator,这是更好的做法。
答案 1 :(得分:0)
终于解决了这个问题。我的类SessionDatabase()是正确的。我的实例是错的。
实施类:
class SessionDatabase implements SaveHandlerInterface, ServiceLocatorAwareInterface {
use ServiceLocatorAwareTrait;
public function write($id, $data) {
$em = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');
}
}
实例:
private function initDbSession(MvcEvent $e) {
$serviceManager = $e->getApplication()->getServiceManager();
$saveHandler = new SessionDatabase();
$saveHandler->setServiceLocator($serviceManager);
}
谢谢大家的帮助!!! :d