控制器外的getServiceLocator()

时间:2014-11-04 18:23:58

标签: php doctrine-orm zend-framework2 service-locator

我有一个班级: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";
    }

}

2 个答案:

答案 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