我正在尝试使用Symfony和它的包系统创建一个插件系统。我知道包必须是独立的,但是对于我的系统来说,我知道我的包永远不会在另一个环境中使用。
我有一个教义实体称为“马克”,我想从主应用程序称为“学生”,使学生可以从我的标记插件的标记关联实体。
目前,我只有一个非常简单的实体Mark,我不知道如何将新字段与我的Student实体相关联
namespace Zenith\QuinzeBundle\Model;
[...]
#[ORM\Entity(repositoryClass: MarkRepository::class)]
class Mark
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 255)]
private ?string $comment = null;
public function getId(): ?int
{
return $this->id;
}
public function getComment(): ?string
{
return $this->comment;
}
public function setComment(string $comment): self
{
$this->comment = $comment;
return $this;
}
}
这是我的学生实体(简化):
namespace Zenith\Entity;
[...]
#[ORM\Entity(repositoryClass: StudentRepository::class)]
class Student
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(length: 255)]
private ?string $firstname = null;
#[ORM\Column(length: 255)]
private ?string $name = null;
public function __construct()
{
$this->userfieldValues = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getFirstname(): ?string
{
return $this->firstname;
}
public function setFirstname(string $firstname): self
{
$this->firstname = $firstname;
return $this;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
如何将这两个实体关联起来,一个在应用程序中,另一个在捆绑包中?
2条答案
按热度按时间jdgnovmf1#
您可以创建指向student表的单个外键链接表。连接表:学生|标记|plugin实体,其中student是student实体的外键。Mark是分配给student的插件的标识符,不使用任何外键。使用此解决方案,您可以随时添加新的student插件,而无需修改student实体。
3npbholx2#
正如@bechir所建议的,我使用了this link form Doctrine documentation,并作为一个魅力工作!
编辑:正如评论所说,解决问题的部分是使用Doctrine工具中的ResolveTargetEntityListener类。它可以允许您注入一个实体,该实体实现所需的相同接口。我为合约创建了一个包,并为我的实体添加了所需的每一个接口。然后在我的主应用程序和我的包中要求这个合同包,然后将我的实体注入到教义元数据中,以重写关联。
在合同包中
第一个
在Symfony主应用中:
在捆绑包中:在Symfony主应用中:
然后,定义你服务中的教义倾听者。