PHP中的领域驱动设计体系结构


Domain-driven design arhitecture in PHP

在PHP DDD应用程序中,文件夹结构如下:

<>之前app/视图/控制器/域/模型/(生成的表单)服务/工厂/之前

下面的类表示什么(从DDD术语的角度来看)以及它们的推荐位置是什么。

  • 字典(基本功能:检查一个单词是否有效)
  • HtmlValidator(基本功能:检查字符串是否是有效的html)
  • UserCollection(基本功能:对用户集合的操作)
  • 这看起来不像一个DDD应用程序。

    特别是,ORM生成的模型不是域模型。如果您的应用程序的核心价值在于数据,而您只需要处理CRUD操作,那么这是一件好事。

    在DDD应用程序中,模型来自领域专家的语言,这是一个知道您的应用程序目标业务的人,因为这是他自己的工作,但对技术一无所知。

    如果你的领域专家谈论dictionary和UserCollection(很奇怪,顺便说一句),这些类实际上是模型。从定义上看,HtmlValidator并不是一个商业术语。

    如果应用程序的价值来自技术组件,我建议您避免使用DDD技术。仅在处理非常复杂的业务规则的应用程序中使用DDD。

    编辑
    大多数情况下,域模型至少需要一个单独的模块。在PHP中,我建议您将它捆绑在(至少)一个单独的包中。然而,使用MVC模式的并不意味着使用DDD:您可以在数据驱动的应用程序中使用MVC,这很好。在这种情况下,我将只在模型中放入ORM生成的类。在这种情况下,我会把所有的类放在controllers/lib文件夹中。

    结构还不错,但是我会把模型重命名为实体,因为在MVC中,模型由服务、实体和其他类型的类组成。

    Dictionary和HtmlValidator没有标识,并且是无状态的,这意味着它们属于服务。

    app/
        views/
        controllers/
        domain/
            entities/ ( orm generated )           
            services/  (HtmlValidator)
            factories/  
    

    虽然它看起来像一个非常简单的应用程序,但它确实意味着您不应该开始使用DDD构建块。每个应用程序都会随着时间的推移而增长,最好从适当的结构开始,以避免以后需要重构它。

    作为下一件事,你应该考虑创建某种模块,这样你就可以分离逻辑部分。您还可以将应用程序和表示层与域和基础结构层分开:

    app/
        views/
        controllers/
    domain/
        module1     
            entities/           
            services/ 
            factories/ 
       module2 
            ....
    vendor/  (infrastructure layer)
        ORM
        ... (some other 3rd party libs)