3

我的问题正是 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 中的块。

因此,我想创建一个其他监听器来监视相关实体的删除并删除该监听器中的引用块。

但这意味着我需要为每个可以放入块中的实体添加一个侦听器。

它可以工作,但它似乎很复杂......也许有人有更好的主意?

4

1 回答 1

0

我不确定我是否很好地理解了您的问题,但是如果您想要在实体中包含实体并在删除父亲时删除子实体,您也可以将实体视为一个块并使用复合模式。

您基本上可以在实体和块上使用相同的界面,并且在实体上,显示功能可能类似于:

foreach ($block in $blocks) {
  $block->display();
}

要在删除父实体时删除所有子实体,您可以简单地在实体的析构函数上执行此操作。

function __destruct() {
   foreach ($block in $blocks) {
     /* call a common interface function that does all that need to be done, implemented on each block */
   }
}

有关复合模式的更多信息: http ://en.wikipedia.org/wiki/Composite_pattern

于 2012-06-19T23:26:21.980 回答