Можно ввести все, что вы хотите, в объект, подключив прослушиватель событий.
Ваш главный Module.php
файл:
namespace Application
class Module
{
public function onBootstrap (MvcEvent $e)
{
/*
* inject service manager into entities on postload event
*/
$serviceManager = $e->getApplication()->getServiceManager();
$doctrineEventManager = $serviceManager
->get('doctrine.entitymanager.orm_default')
->getEventManager();
$doctrineEventManager->addEventListener(
array(\Doctrine\ORM\Events::postLoad),
new \Application\Entity\InjectListener($serviceManager)
);
{
}
Application\Entity\InjectListener
класс:
namespace Application\Entity;
class InjectListener
{
private $sm;
public function __construct($sm)
{
$this->sm = $sm;
}
public function postload($eventArgs)
{
$entity = $eventArgs->getEntity();
$entity->setServiceManager($this->sm);
}
}
Все ваши объекты должны расширяет класс с методом setServiceManager
. После этого приложения конфигурации внутри объекта:
$config = $this->sm->get('Configuration');
Если вам не нужно вводить все менеджер службы, но только конфигурации, а setServiceManager
метод сделать setApplicationConfig
метод:
namespace Application\Entity;
class InjectListener
{
private $config;
public function __construct($sm)
{
$this->sm = $sm;
}
public function postload($eventArgs)
{
$entity = $eventArgs->getEntity();
$entity->setApplicationConfig(
$this->sm->get('Configuration')
);
}
}
спасибо! Отличное решение ... –
Чтобы немного обновить этот ответ, если вы не хотите обновлять все свои сущности, вы должны создать интерфейс и реализовать в тех объектах, которые в нем нуждаются. Итак, что-то вроде 'ServiceManagerAwareInterface', а затем вы можете легко проверить свой' InjectListener :: postLoad() ', является ли Entity экземпляром' ServiceManagerAwareInterface', если так вы можете установить менеджера. – Kwido