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