2013-12-20 3 views
1

У меня есть объект doctrine, который содержит ссылку на файл. Когда объект удаляется, файл ссылки также следует удалить с помощью @HasLifecycleCallbacks и preRemove(). Проблема в том, что ссылка на файл, сохраненный в объекте, является относительным путем, а первая часть для его завершения сохраняется в конфигурации zf2.ZF2 + Doctrine 2 & access to zf config

Как получить доступ к конфигурации zf2 изнутри объекта, чтобы я мог построить полный путь и удалить файл?

ответ

3

Можно ввести все, что вы хотите, в объект, подключив прослушиватель событий.

Ваш главный 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') 
     ); 
    } 
} 
+0

спасибо! Отличное решение ... –

+0

Чтобы немного обновить этот ответ, если вы не хотите обновлять все свои сущности, вы должны создать интерфейс и реализовать в тех объектах, которые в нем нуждаются. Итак, что-то вроде 'ServiceManagerAwareInterface', а затем вы можете легко проверить свой' InjectListener :: postLoad() ', является ли Entity экземпляром' ServiceManagerAwareInterface', если так вы можете установить менеджера. – Kwido

Смежные вопросы