访问symfony 2实体内的配置值

时间:2014-04-03 17:15:01

标签: symfony dependency-injection doctrine

在symfony 2应用程序中访问实体内部配置值的最佳方法是什么?

我已经搜索了这个,我找到了两个解决方案:

  1. 将实体定义为服务并注入服务容器以访问配置值
  2. this approach使用允许获取参数值的静态方法在实体的同一束中定义类
  3. 还有其他解决方案吗?什么是最好的解决方法?

2 个答案:

答案 0 :(得分:2)

除关联实体外,您的实体不应真正访问任何其他内容。它不应该与外界真正有任何联系。

执行所需操作的一种方法是使用订阅者或侦听器来侦听实体加载事件,然后使用通常的setter将该值传递给实体。

例如......

您的实体

namespace Your\Bundle\Entity;

class YourClass
{
    private $parameter;

    public function setParameter($parameter)
    {
        $this->parameter = $parameter;

        return $this;
    }

    public function getParameter()
    {
        return $this->parameter;
    }

    ...

}

你的听众

namespace Your\Bundle\EventListener;

use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\LifecycleEventArgs;
use Your\Bundle\Entity\YourEntity;

class SetParameterSubscriber implements EventSubscriber
{
    protected $parameter;

    public function __construct($parameter)
    {
        $this->parameter = $parameter;
    }

    public function getSubscribedEvents()
    {
        return array(
            'postLoad',
        );
    }

    public function postLoad(LifecycleEventArgs $args)
    {
        /** @var YourEntity $entity */
        $entity = $args->getEntity();

        // so it only does it to your YourEntity entity
        if ($entity instanceof YourEntity) {
            $entity->setParameter($this->parameter);
        }
    }
}

您的服务档案。

parameters:
    your_bundle.subscriber.set_parameter.class: 
            Your\Bundle\EventListener\SetParameterSubscriber
            // Should all be on one line but split for readability

services:
    your_bundle.subscriber.set_parameter:
        class: %your_bundle.subscriber.set_parameter.class%
        arguments:
            - %THE PARAMETER YOU WANT TO SET%
        tags:
            - { name: doctrine.event_subscriber }

答案 1 :(得分:0)

您的实体不需要配置。

例如,您有File实体,您需要将此实体所代表的文件保存到磁盘。你需要一些参数,比如说“upload_dir”。您可以以某种方式将此参数传递给实体,并在此实体中定义一个方法,该方法保存文件以上载目录。但更好的方法是创建一个负责保存文件的服务。然后你可以将configurtion注入到它中,并在save方法中传递实体对象作为参数。