getServiceLocator () вне контроллера

У меня есть класс: ClassA()Мне нужна служба Доктрины $this->getServiceLocator()->get('Doctrine\ORM\EntityManager');,

Я пытаюсь реализовать интерфейс ServiceManagerAwareInterface, но функции, getServiceLocator() а также setServiceLocator(ServiceLocatorInterface $serviceLocator) не работа.

Кто-то использовал ServiceLocator вне класса Controller в ZF2? Возможно?

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

}

-1

Решение

Самый простой способ — использовать ServiceLocatorAwareTrait (часть ZF2). Если вы используете это, убедитесь, что ваш класс реализует ServiceLocatorAwareInterface (вам на самом деле не нужно реализовывать его, поскольку черта делает это за вас, но вы должны добавить его к предложению реализации вашего класса).

Итак, вы получите что-то вроде этого:

use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorAwareTrait;

class ClassA implements ServiceLocatorAwareInterface {
use ServiceLocatorAwareTrait;
}

Затем вы можете просто вызвать $ this-> getServiceLocator (), чтобы получить экземпляр servicelocator.

Однако если вам просто нужен менеджер сущностей Doctrine, лучше внедрить эту зависимость вместо внедрения ServiceLocator.

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

0

По вопросам рекламы [email protected]