Php 如何将容器/服务注入Symfony2中的Doctrine2实体?
我知道这个问题乍一看很可怕 这就是我所拥有的: 我将模型的一部分存储在*.yaml文件中,并在需要时加载。我们称之为StaticObject。它有10个左右的对象,不可按设计缩放,并且是只读的。每个StaticObject都有自己的ID,我可以从容器中的服务获取具有给定ID的对象,如: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
$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
}