我的问题正是 Doctrine 文档中Strategy Pattern文章中描述的问题:
- 页面实体
- 一个页面可以有一些块
- 块可能是文本、图像、表格、日历……(策略)
- 页面知道它包含的块,但不知道它们的行为
- 块继承是不可能的
所描述的解决方案(策略模式)似乎正是我所需要的(阅读文章了解更多信息):
页:
<?php
namespace Page\Entity;
class Page
{
/**
* @var int
* @Id @GeneratedValue
* @Column(type="integer")
*/
protected $id;
/**
* @var string
* @Column
*/
protected $title;
/**
* @var string
* @Column(type="text")
*/
protected $body;
/**
* @var Collection
* @OneToMany(targetEntity="Block", mappedBy="page")
*/
protected $blocks;
// ...
}
堵塞:
<?php
namespace Page\Entity;
class Block
{
/**
* @Id @GeneratedValue
* @Column(type="integer")
*/
protected $id;
/**
* @ManyToOne(targetEntity="Page", inversedBy="blocks")
*/
protected $page;
/**
* @Column
*/
protected $strategyClass;
/**
* Strategy object is instancied on postLoad by the BlockListener
*
* @var BlockStrategyInterface
*/
protected $strategyInstance;
// ...
}
策略界面:
<?php
namespace Page\BlockStrategy;
interface BlockStrategyInterface
{
public function setView($view);
public function getView();
public function setBlock(Block $block);
public function getBlock();
public function renderFrontend();
public function renderBackend();
}
我可以很容易地想象,如果我展示一个表格或一个日历,我的策略是什么;但是如果我的策略是显示其他实体的内容呢?
该块需要了解实体类/ID,并且必须在删除相关实体时将其删除。
我想在 BlockListener 中的 postLoad 事件中添加entityClass
和属性并加载相关实体。entityId
但是如果相关实体不存在怎么办?我无法删除 postLoad 中的块。
因此,我想创建一个其他监听器来监视相关实体的删除并删除该监听器中的引用块。
但这意味着我需要为每个可以放入块中的实体添加一个侦听器。
它可以工作,但它似乎很复杂......也许有人有更好的主意?