Symfony捆绑包中与插件系统的主应用程序实体关联的实体

wrrgggsh  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(173)

我正在尝试使用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;
    }

如何将这两个实体关联起来,一个在应用程序中,另一个在捆绑包中?

jdgnovmf

jdgnovmf1#

您可以创建指向student表的单个外键链接表。连接表:学生|标记|plugin实体,其中student是student实体的外键。Mark是分配给student的插件的标识符,不使用任何外键。使用此解决方案,您可以随时添加新的student插件,而无需修改student实体。

3npbholx

3npbholx2#

正如@bechir所建议的,我使用了this link form Doctrine documentation,并作为一个魅力工作!
编辑:正如评论所说,解决问题的部分是使用Doctrine工具中的ResolveTargetEntityListener类。它可以允许您注入一个实体,该实体实现所需的相同接口。我为合约创建了一个包,并为我的实体添加了所需的每一个接口。然后在我的主应用程序和我的包中要求这个合同包,然后将我的实体注入到教义元数据中,以重写关联。
在合同包中
第一个
在Symfony主应用中:

namespace Zenith\Entity;

use Zenith\ContractsBundle\StudentInterface;

class Student implements StudentInterface {

    {...}
    #[ORM\OneToMany(mappedBy: 'student', targetEntity: MarkInterface::class)]
    private Collection $marks;

}

在捆绑包中:在Symfony主应用中:

namespace Zenith\MyBundle\Entity;

use Zenith\ContractsBundle\MarkInterface;

class Mark implements MarkInterface { ... }

然后,定义你服务中的教义倾听者。

相关问题