可以使用DDD创建CMS吗?
#php #cms #ddd

cms的基础是解决一个通用问题的软件 - 在网站上管理内容。 Joomla,WordPress和其他流行系统很简单且通用,那里没有域名 - 仅创建帖子,在Partcular URL上显示它们...但是,您确定吗?

当我开始编写自己的CMS时,我决定尝试使用域驱动的设计来执行此操作。一开始,这真的很痛苦,因为流行系统设定的心态。现在,经过研究,数小时的建模和原型制作,我改变了心态。让我向您展示我是如何做到的。

在本文中,您会发现:

  • CMS中的域在哪里?
  • 如何改变思维以在CMS中找到域?
  • 如何从CMS中结晶行为?
  • 每个CMS都需要DDD吗?

本文假定您对DDD和软件体系结构具有基本知识。在此,将在此处进行研究和分析的某些部分,以允许作者创建简短但内容的文章。

CMS中的域在哪里?

CMS的基本功能是创建一些内容并在浏览器中显示。要创建内容,您需要一些处理请求的表单和控制器,并将数据保存在数据库中。糟糕吗?但是,有一个问题 - 如果您可以描述“系统的行为”而不是其构建方式或存储数据的位置怎么办?系统创建内容,将此内容发布在URL上,将内容分配给类别等。因此,不仅仅想到系统的行为而不是在哪里保存数据?

构建每个软件系统旨在为业务问题提供一些解决方案。 CMS是同一件事 - 这里的业务问题是允许用户添加和Modyfy网站的内容。就像在商店中一样,您可以“将产品添加到购物车”或“增加购物车中的产品数量”。在CMS中,您可以“创建新帖子”并“发布”。

系统的每一个行为已经是您域的一部分。关键是,您必须考虑行为类别中的任何系统,而不是技术方面的事情。从这些行为中,您可以发现有界的上下文,新的聚集体在春季的新花朵中出现:)

是的,您是对的,不是到处都是:)我们作为建筑师的工作的一部分是决定在系统中更好地使用DDD以及在何处使用简单的CRUD。当您具有“保存节点”时,“更新节点”“ ecruptiors” - 您不需要DDD:)

找到“域”的更好方法是事件袭击 - 它是一种强大的建模方法。但是,只有在您至少可以与您的一个coleague一起进行会话时,它才能起作用 - 仅做会议是一个可怕的主意:D

CMS中的DDD在真实项目中

要向您展示真实的项目,我需要描述您的业务逻辑。我会告诉你我在Tulia CMS中这样做的方式。

Tulia CMS的域逻辑

内容元素称为节点。这些节点可以翻译成外语,可以具有存储节点简单详细信息的属性(例如:图像,某些链接,节点的内容等)。节点可以分配并无分配给类别。节点具有从标题中产生的标题和sl。节点还具有描述创建该节点的目的,并且一个节点可以实现多种目的。好,让我们继续前进。

从上面的描述中,您可以选择描述系统的行为。我们有:

  • 创建节点
  • 添加/更新/删除属性
  • 分配/非分配类别
  • 更改标题
  • 强加/停止目的

总计的

我们有行为,因此我们可以创建聚合!在本文中,我仅选择节点行为,因此更简单地找到汇总的行为,但是当您创建它时,请始终意识到“汇总规则”!

final class Node {
    public static function create(
        string $id,
        string $title,
        array $locales,
    ): self;

    public function changeTitle(
        string $title,
        ?string $alias = null,
    ): void;

    public function addAttribute(
        string $code,
        mixed $value,
    ): void;

    public function publish(
        ImmutableDateTime $publishedAt,
        ?ImmutableDateTime $publishedTo = null,
    ): void;

    /** Replace all purposes with new ones **/
    public function persistPurposes(
        string ...$purposes,
    ): void;

    public function assignToMainCategory(
        string $category,
    ): void;
}

上面的代码是现实生活中的简化版本,您可以在这里看到:https://github.com/tuliacms/cms/blob/master/src/Cms/Node/Domain/WriteModel/Model/Node.php

节点具有标题,属性,类别和目的。您可能会注意到,没有“内容” - 因为Tulia CMS中的内容是其中一个属性。静态工厂方法用于在Tulia CMS中创建对象, $ locales 将所有可用的位置存储在系统中(记住吗?节点是可转换的)。

这里最重要的课程,这里没有“技术”,例如保存/更新,设置器等 - 仅行为。这就是系统行为的方式,这就是系统允许用户对其做任何事情的方式。它可以帮助您在任何业务问题中找到域名,即使像CMS一样通用。您只需要停止将事物作为技术系统而迫使自己思考系统行为。

每个CM都有一个域吗?

是。每个系统,因为企业拥有自己的领域,都专门从事某些事情。甚至不是CM,而是每个系统都有一些域。每个解决任何业务问题的系统都有一个领域,但是问题是...每个CMS都需要DDD吗?

每个CM都需要DDD吗?

不,不是每个人。如果您构建简单的系统,只有类似Crud的操作或太通用的系统(例如可重复使用的组件),则在这里不需要DDD。 DDD会影响您需要编写多少代码,这是不值得的。

但是,如果您的系统具有特定的行为,例如在Tulia CMS中,如果揭示了开发人员可以扩展此行为的地方 - 这是在此处考虑DDD的好方法。

结论

每个特定于业务的问题都可以用DDD建模,只有当不是CRUD :)开发Tulia CMS是使用DDD建模系统的一种完全不同的方法,因为首先看不到CMS中的域位置并不明显。是。当我将思想转变为系统行为时,一切都改变了。

如果您对整个域OD Tulia CMS的制作感兴趣,请随时去此处:https://github.com/tuliacms/cms/tree/master/src/Cms/Node。您可以找到具有聚合,实体之间的关系,读取模型和写入模型的分离的整个域模型,等等。