[英]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.