繁体   English   中英

如何在Symfony2中向Doctrine2实体注入容器/服务?

[英]How to inject container/service to Doctrine2 entity in Symfony2?

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

这就是我所拥有的:

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

$container->get('static_object_repository')->getById('foo');

现在,我有一些实体与该StaticObject具有“关联”。 我希望将其作为ID存储在数据库中,因此我向实体添加了新字段$ staticObjectId,如下所示:

class MyEntity
{
    //...

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

    //...
}

现在,每次我想从实体中获取StaticObject时,都从容器中调用service,例如:

$staticObject = $container->get('static_object_repository')->getById($entity->getStaticObjectId());

当我想更改该关联对象时,我会执行以下操作:

$entity->setStaticObjectId($staticObject->getId());

希望您获得有关我的代码的足够信息。 告诉我是否想念一些让您理解问题的重要内容。

这就是我要的:

我想将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);
    }

    //...
}

但是等等...我的模型中没有容器。 是不是 我无处可寻如何将容器/服务注入实体。

我的第二个想法是使用自定义学说映射类型。 再说一次-您不能向其注入服务(因为自定义类型是class,没有对象/服务)。 我已经完成了Doctine2文档这一节中的所有工作,在Symfony2 cookbook中阅读了此节 ,但是看不到解决方案。

我怎样才能做到这一点?

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

该文档很棒

通常,在实体关系离开ORM架构以及到达日常应用程序层之前,建立它们之间的关系是一个好主意。 最好的方法是保持实体简单:

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

    public function getStaticObject()
    {
        return $this->staticObject;
    }
}

并在加载行后立即使用自定义Hydrator设置StaticObject:

https://www.techpunch.co.uk/development/create-custom-doctrine2-hydrator-symfony2

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

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

    return $this->staticObject
}

您应该执行的操作如下:

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

当然,您也可以搜索该问题的其他答案。 例如: 在实体对象内注入或访问服务容器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM