为什么cakePHP被设计成使用继承而不是组合,尽管这通常被认为是一个糟糕的设计?

bq9c1y66  于 2022-11-11  发布在  PHP
关注(0)|答案(3)|浏览(129)

我们公司的CakePHP应用程序变得越来越复杂,变得越来越难以维护。我认为其中一个原因是继承,它使得子类中的函数依赖于它的父类,反之亦然(实现模板方法模式)。为什么CakePHP是这样设计的,并且在使用依赖注入、策略或工厂模式时不友好?

uyto3xhc

uyto3xhc1#

这个框架并不像你说的那么糟糕。当然,可能还有一些事情可以做得更好,但我希望看到一个更实质性的评论,包括坚实的论据和例子。我假设你没有按照预期使用这个框架。
让我引用this page的第一段。
根据Eric Evans的说法,领域驱动的设计(DDD)不是一种技术或方法。它是一种关于如何组织应用程序和构建代码的不同的思考方式。这种思考方式非常好地补充了流行的MVC架构。域模型提供了系统的结构视图。大多数时候,应用程序不会改变,改变的是域。然而,MVC这就是为什么有些框架不强迫你使用特定的模型结构,而是让你的模型随着你的知识和专业知识的增长而发展。
您没有显示代码(出于某种原因?),所以我猜您的问题来自于将所有内容填充到src/Model/Table/中的表对象中或执行类似的操作。
但您完全可以自由地创建一个文件夹结构,如

  • /src/服务
  • /src/模型/域

然后在控制器动作中根据需要示例化服务。例如,服务可以是\App\Service\User\Registration,并使用App\Model\Domain\User中的对象。
我同意这个框架事实上并没有提供任何建议或模板结构来解释这个可能的样子。对于这个主题there is a discussion going on here。因为缺少这样一个结构I've started working on a plugin that provides this。这个插件并不需要,但建议使用DI容器的人谁想要他们。
考虑到目前为止围绕DI和DDD的整个花哨的主题,我想说,只要代码易于维护,就没有一种方法可以让事情变得正确,而是有不同的途径。老实说,只要这个目标是存档的,我真的不在乎你怎么称呼它。:)我认为许多人倾向于把这个主题变成学术性的,而不是简单地尝试实用。
并不是每个人都需要这种结构。这取决于你是在构建RAD CRUD应用程序还是更复杂的应用程序。并不是每个应用程序都需要DDD方法。当涉及到设计业务层时,有太多的灰色阴影,不管框架是如何做的,总会有人抱怨。
我 * 个人 * 几乎从来没有错过一个DI容器在CakePHP中,甚至没有在最大的项目有超过~560个数据库表,这是一个医院管理解决方案,它只是工作得很好。
我建议你问一个更具体的问题,关于你的方法,你是如何组织你的代码的,展示你的结构和代码,然后就如何改进它征求建议,而不是在没有提供上下文的情况下指责你首先使用的工具。

h9vpoimq

h9vpoimq2#

不幸的是,CakePHP v3无法与Zend 3/Laminas、Symfony或Laravel相比。它比其他框架落后了7-8年。如果你已经使用Cake很多年了,或者这是你的第一个也是最后一个框架,没有意识到这一点是正常的。但是如果你在Zend 3之后不得不使用它... Cake看起来像是一个非常糟糕的生态系统。
1.文档错误

  1. ORM错误
    1.布线系统不佳
    1.模板引擎错误
    1.将数据Map器和活动记录混合使用是个坏主意
  2. DIC完全缺失
    1.组件-不好,但也不可怕...
    1.更多的人认为不应该低估像-缺乏教程,插件/插件/包
    以上的思考使开发者对遵循不良做法这一点增加了很多技术深度。
    如果你只关心-它的工作!但不是它如何工作,为什么它是坏的,蛋糕将适合你。
    如果你正在做一个大的项目,Cake的伸缩性不如Symfony/Laminas。(是的AWS/GC可以帮助伸缩很多思考,但不能伸缩源代码)
    蛋糕不允许你像Laravel/Symfony那样快速开发体面的项目。
    我想知道今天谁和
    为什么
    会使用Cake开始一个新项目,因为它比其他框架好处。
    可能只有那些在过去十年中只使用Cake并且不想开始学习新技术的开发人员,或者认为SOLID只是一种花哨的宣传,没有任何好处的开发人员,例如设计模式DRYKISS
rkttyhzu

rkttyhzu3#

CakePHP框架使用Active record提供用户与数据库的交互,这意味着业务层和数据库层之间存在高耦合,这对单元测试有负面影响,因为该框架对依赖注入不友好。工厂模式也存在同样的问题,前面提到的高耦合使得在单元测试中使用模拟对象变得更加困难。
希望能有所帮助!
阿尔贝托

相关问题