Php 如何在Symfony2中获取实体类中的内核实例

Php 如何在Symfony2中获取实体类中的内核实例,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,标题很好地解释了这个问题。我在Doctrine实体类的生命周期回调中,想做一些额外的DB条目。为此,我需要获得内核的一个实例。我该怎么做 如果您必须使用某些服务,则不应特别使用整个容器或内核实例 使用服务本身-始终尝试注入单个服务,而不是整个容器 你的案子看起来应该用 大多数情况下,需要实体中的容器/内核是错误的。实体不应该知道任何服务。为什么呢 基本上,实体是表示事物的对象。实体主要用于关系数据库,但您可以随时将此实体用于其他事项(序列化它,从HTTP层实例化它…。 您希望您的实体是可单元测试

标题很好地解释了这个问题。我在Doctrine实体类的生命周期回调中,想做一些额外的DB条目。为此,我需要获得内核的一个实例。我该怎么做

  • 如果您必须使用某些服务,则不应特别使用整个容器或内核实例
  • 使用服务本身-始终尝试注入单个服务,而不是整个容器
  • 你的案子看起来应该用

  • 大多数情况下,需要实体中的容器/内核是错误的。实体不应该知道任何服务。为什么呢

    基本上,实体是表示事物的对象。实体主要用于关系数据库,但您可以随时将此实体用于其他事项(序列化它,从HTTP层实例化它…。
    您希望您的实体是可单元测试的,这意味着您需要能够轻松地实例化您的实体,而不需要任何东西,主要是不需要任何业务逻辑

    您应该将您的逻辑移动到另一个层,该层将实例化您的实体。
    对于您的用例,我认为,最简单的方法是使用

    services.yml

    Acme\FooBundle\Bar\BarListener


    现在,您的实体保持平坦,没有依赖关系,您可以轻松地对事件侦听器进行单元测试

    我认为您做得不对,您不应该在实体中使用内核。您的用例是什么?在回拨中,我需要进行一些DB操作,以保持一些内部一致性。要进行这些DB操作,我需要获取Object Manager的实例,要获取OM的实例(已注册为服务),我需要内核实例。加载后事件侦听器怎么样?在那里,您可以轻松地将对象管理器作为构造函数中的内核实例,而不违反标准?
    services:
        acme_foo.bar_listener:
            class: Acme\FooBundle\Bar\BarListener
            arguments:
                - @kernel
            tags:
                - { name: doctrine.event_listener, event: postLoad }
    
    use Symfony\Component\HttpKernel\KernelInterface;
    use Doctrine\ORM\Event\LifecycleEventArgs;
    use Acme\FooBundle\Entity\Bar;
    
    class BarListener
    {
        protected $kernel;
    
        /**
         * Constructor
         *
         * @param KernelInterface $kernel A kernel instance
         */
        public function __construct(KernelInterface $kernel)
        {
            $this->kernel = $kernel;
        }
    
        /**
         * On Post Load
         * This method will be trigerred once an entity gets loaded
         *
         * @param LifecycleEventArgs $args Doctrine event
         */
        public function postLoad(LifecycleEventArgs $args)
        {
            $entity = $args->getEntity();
    
            if (!($entity instanceof Bar)) {
                return;
            }
    
            $entity->setEnvironment($this->kernel->getEnvironment());
        }
    }