Php 如何将容器/服务注入Symfony2中的Doctrine2实体?

Php 如何将容器/服务注入Symfony2中的Doctrine2实体?,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我知道这个问题乍一看很可怕 这就是我所拥有的: 我将模型的一部分存储在*.yaml文件中,并在需要时加载。我们称之为StaticObject。它有10个左右的对象,不可按设计缩放,并且是只读的。每个StaticObject都有自己的ID,我可以从容器中的服务获取具有给定ID的对象,如: $container->get('static_object_repository')->getById('foo'); $staticObject = $container->get('st

我知道这个问题乍一看很可怕

这就是我所拥有的: 我将模型的一部分存储在*.yaml文件中,并在需要时加载。我们称之为StaticObject。它有10个左右的对象,不可按设计缩放,并且是只读的。每个StaticObject都有自己的ID,我可以从容器中的服务获取具有给定ID的对象,如:

$container->get('static_object_repository')->getById('foo');
$staticObject = $container->get('static_object_repository')->getById($entity->getStaticObjectId());
现在我有了一些实体,它与这个静态对象有“关联”。我希望它作为ID存储在数据库中,所以我向实体添加了新字段$staticObjectId,如下所示:

class MyEntity
{
    //...

    /**
     * @ORM\Column(type="string", name="static_object_id")
     */
    protected $staticObjectId;

    //...
}
// MyEntity
public function getStaticObject()
{
    if (!isset($this->staticObject)) {
        $this->staticObject = $this->staticObjectFactory->loadById($this->getStaticObjectId());
    }

    return $this->staticObject
}
现在,每当我想从实体中获取StaticObject时,我都会从容器中调用服务,如:

$container->get('static_object_repository')->getById('foo');
$staticObject = $container->get('static_object_repository')->getById($entity->getStaticObjectId());
当我想更改关联对象时,我会执行以下操作:

$entity->setStaticObjectId($staticObject->getId());
public function getStaticObject($staticObjectRepository)
{
    return $staticObjectRepository->getById($this->staticObjectId);
}
我希望你对我的代码有足够的了解。如果我遗漏了一些重要的东西,请告诉我,以便你们理解这个问题

这就是我想要的: 我想将StaticObject实例直接存储在实体中,这样我就可以简单地获取和设置它。很简单

$entity->getStaticObject();
//and
$entity->setStaticObject($staticObject);
我的第一个想法是在getter和setter中隐藏所有需要的转换。所以我得到:

class MyEntity 
{
    //...

    public function setStaticObject(StaticObject $so)
    {
        $this->staticObjectId = $so->getId();
    }

    public function getStaticObject()
    {
        return $container->get('static_object_repository')->getById($this->staticObjectId);
    }

    //...
}
但是等等。。。我的模型中不能有容器。不是吗?我找不到如何将容器/服务注入实体

我的第二个想法是使用自定义原则映射类型。同样,您不能向它注入服务(因为自定义类型是类,没有对象/服务)。我做到了,但我看不出解决办法


如何执行此操作?

您可以在prePersist、preUpdate等上设置侦听器,然后通过服务配置将服务注入其中


您可以在prePersist、preUpdate等上设置侦听器,然后通过服务配置将服务注入其中


你应该做的是:

$entity->setStaticObjectId($staticObject->getId());
public function getStaticObject($staticObjectRepository)
{
    return $staticObjectRepository->getById($this->staticObjectId);
}

当然,你也可以搜索这个问题的其他答案。例如:

您应该做的是:

$entity->setStaticObjectId($staticObject->getId());
public function getStaticObject($staticObjectRepository)
{
    return $staticObjectRepository->getById($this->staticObjectId);
}

当然,你也可以搜索这个问题的其他答案。例如:

通常,在实体关系离开ORM体系结构并到达日常应用层之前,构建实体关系是一个好主意。做到这一点的最佳方法是使实体保持简单:

class MyEntity
{
    public function setStaticObject(StaticObject $so)
    {
        $this->staticObject = $so;
    }

    public function getStaticObject()
    {
        return $this->staticObject;
    }
}
并在加载行之后,使用自定义对象设置StaticObject:

如果延迟加载很重要,那么使用自定义方法注入StaticObjectFactory类并不是一个很大的步骤,您可以这样使用它:

class MyEntity
{
    //...

    /**
     * @ORM\Column(type="string", name="static_object_id")
     */
    protected $staticObjectId;

    //...
}
// MyEntity
public function getStaticObject()
{
    if (!isset($this->staticObject)) {
        $this->staticObject = $this->staticObjectFactory->loadById($this->getStaticObjectId());
    }

    return $this->staticObject
}

通常,在实体关系离开ORM体系结构并到达日常应用层之前,构建实体关系是一个好主意。做到这一点的最佳方法是使实体保持简单:

class MyEntity
{
    public function setStaticObject(StaticObject $so)
    {
        $this->staticObject = $so;
    }

    public function getStaticObject()
    {
        return $this->staticObject;
    }
}
并在加载行之后,使用自定义对象设置StaticObject:

如果延迟加载很重要,那么使用自定义方法注入StaticObjectFactory类并不是一个很大的步骤,您可以这样使用它:

class MyEntity
{
    //...

    /**
     * @ORM\Column(type="string", name="static_object_id")
     */
    protected $staticObjectId;

    //...
}
// MyEntity
public function getStaticObject()
{
    if (!isset($this->staticObject)) {
        $this->staticObject = $this->staticObjectFactory->loadById($this->getStaticObjectId());
    }

    return $this->staticObject
}