问题:
在我的Symfony 4.4应用程序中,有一个Notification
实体类(通过Doctrine ORM 2.7管理)。在现实生活中,每个Notification
对象都可以与一个“对象”相关。此“主题”可以是Task
,Project
,Document
,Invoice
,Contract
等,它们本身都是实体类
理想情况下,有可能使用Notification::getSubject
和Notification::setSubject
方法。并且如果可能的话,NotificationRepository::findBy('subject' => $subject)
也可以工作–那样有意义。
问题:
使用Symfony和Doctrine ORM在Notification
实体类和所有这些不同的“主题”实体类之间设计实现的干净/好方法是什么?是否应该使用OOP设计模式?
答案 0 :(得分:1)
由于您的问题相当模糊,我认为您应该开始定义实体。 一个好的方法是制作一个Entity Relationship Diagram。 首先考虑实体将如何在它们之间进行交互是一件好事。 开发新功能时,图表非常有用。
然后,当您对要执行的操作有清晰的想法时,只需编写代码即可。
对于您要问的问题,我尝试制作这样的图,但是它可能是不完整的,因为我不了解您的项目:
当然,我并没有代表您描述的每个实体,但是您知道了。
继承的好处是,您可以调用Notification::getSubject
,然后知道它是哪种主题
您将创建实体Subject
,然后扩展Task
,Project
,Document
,Invoice
,{{1} }等。
要在学说中创建继承:
Contract
#src\Entity\Subject
/**
* @ORM\Table(name="subject")
* @ORM\Entity(repositoryClass="App\Repository\SubjectRepository")
* @ORM\InheritanceType(value="JOINED")
* @ORM\DiscriminatorColumn(name="subject_type", )
* @ORM\DiscriminatorMap(value={SUB_TYPE_DOCUMENT=Document::class, SUB_TYPE_PROJECT=Project::class, SUB_TYPE_TASK=Task::class})
*/
abstract class Subject{
const SUB_TYPE_DOCUMENT = 'DOCUMENT';
const SUB_TYPE_PROJECT = 'PROJECT';
const SUB_TYPE_TASK = 'TASK';
...
}
#src\Entity\Document
class Document extends Subject{
...
}
#src\Entity\Project
class Project extends Subject{
...
}
更多信息,请访问:https://www.doctrine-project.org/projects/doctrine-orm/en/2.7/reference/inheritance-mapping.html
这是一种非常经典的处理方式。现在,您问是否有#src\Entity\Task
class Task extends Subject{
...
}
要使用。
想到的可能是Decorator。我建议您阅读一下。
如果以上方法均无济于事,请编辑您的问题并添加有关所需内容的更多详细信息...