Doctrine orm ZF2和x2B;第2条及;访问zf配置

Doctrine orm ZF2和x2B;第2条及;访问zf配置,doctrine-orm,zend-framework2,Doctrine Orm,Zend Framework2,我有一个条令实体,它持有对文件的引用。删除实体时,还应使用@HasLifecycleCallbacks和preRemove()删除引用的文件。问题是,对保存在实体中的文件的引用是一个相对路径,完成它的第一部分保存在zf2配置中 如何从实体中访问zf2配置,以便生成完整路径并删除文件?可以通过附加事件侦听器将任何您想要的内容注入实体 您的主Module.php文件: namespace Application class Module { public function onBootst

我有一个条令实体,它持有对文件的引用。删除实体时,还应使用@HasLifecycleCallbacks和preRemove()删除引用的文件。问题是,对保存在实体中的文件的引用是一个相对路径,完成它的第一部分保存在zf2配置中


如何从实体中访问zf2配置,以便生成完整路径并删除文件?

可以通过附加事件侦听器将任何您想要的内容注入实体

您的主
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
class:

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');
如果不需要注入所有service manager,只需配置,而不是
setServiceManager
method make
setApplicationConfig
method:

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()
实体是否是
ServiceManagerAwareInterface
的实例,如果是,您可以设置管理器。