ZF2 + Doctrine 2&访问zf配置

时间:2013-12-20 11:29:28

标签: doctrine-orm zend-framework2

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

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

1 个答案:

答案 0 :(得分: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方法make 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')
        );
    }
}