我的 CakePHP 3 评论 - 仍然新鲜,仍然很热

已发表: 2022-03-11

上个月,CakePHP 团队宣布推出 CakePHP 3 的 alpha 版本。Cake 开发团队认为版本 3 将改变游戏规则,因此随着版本 3 的 alpha 版本现已火热出炉,本文采取了重新审视 CakePHP 3 作为 PHP 开发的有效现代框架。

这款 CakePHP 3 款待刚出炉。

一个简短的历史

如今,在 PHP 开发方面有很多选择。 随着 PHP 的成熟,越来越多的 PHP 框架应运而生,为开发人员提供了广泛的选择。 但并非总是如此。

早在 2005 年,当 PHP 4 仍然是标准时,还没有 PHP 框架,在 PHP 中开发面向对象的编码方法无疑是一个挑战。 就在那时,CakePHP 出现了——有史以来第一个 PHP MVC 框架。 自首次发布以来的近 10 年里,CakePHP 一直在不断发展,在 PHP 开发人员中保持着健康的市场份额。

CakePHP 框架有多受欢迎? 它在 GitHub 上排名前 4 位最受欢迎的 PHP 项目,约有 130,000 个项目,CakePHP Google 组中有超过 18,000 名成员,有 32,000 个主题。 拥有 270 名代码贡献者和 320 名文档贡献者,不可否认 CakePHP 拥有大量追随者。 CakePHP 当前的广泛流行和日益流行的趋势在一篇文章中得到了很好的总结,James Watts 是 Cake 软件基金会的 CakePHP 的核心成员和社区经理,我在撰写本文的过程中采访了他。

随着该框架的第 3 版现已推出,CakePHP 无疑将继续成为 PHP 世界的主导力量,并在当今各种 PHP 框架环境中成为主要竞争者。

CakePHP 第 3 版有什么新功能?

这篇评论基于 CakePHP 3.0 的 alpha 版本,其中包含许多新功能和增强功能,包括:

  • 更好的性能。 版本 3 对引导过程、路由过程和生成帮助模板的过程的几个部分进行了性能改进。

  • 增强的组件和助手。 第 3 版通过其新的 FlashHelper 和 FlashComponent 增强了对“闪存消息”的支持。 此外,CookieComponent 也得到了增强,可以更轻松地分离 cookie 命名空间的配置和 cookie 数据的处理。

  • 改进的会话管理。 会话管理一直是 CakePHP 中的一个静态类,已被证明在许多方面存在问题。 使用版本 3,您现在可以从请求对象$this->request->session()访问会话。 此更改还使会话更易于测试,并使 CakePHP 能够使用 PHPUnit 4.x。

  • 改进了约定的一致性。 应用程序骨架和插件骨架已更新为使用相同的目录结构,以便彼此更加一致。

  • 主题和插件合并。 CakePHP 3 的一个关键目标是使主题更加强大和健壮。 朝着这个目标努力,很明显真正需要的是主题提供与插件相同的功能。 因此,任何插件现在都可以用作主题,这也简化了打包和重新分发。

  • ORM 改进。 对 ORM(对象关系映射)进行了一些 API 更改。 最值得注意的是,现在为保存操作指定深度关联更加简单,并且更改了一些约定以减少新采用者的学习曲线和混淆。

此外,还计划将一些附加功能纳入 3.0 版的测试版中。 最重要的是:

  • 国际化和本地化(i18n 和 L10n)功能增强
  • 基于 Edge Side Includes 的 CacheHelper 替代品
  • 一个新的路由 API,用于更简单和更快的路由声明

事实上,版本 3 代表了对 CakePHP 先前版本的重大升级。

为什么选择 CakePHP?

虽然 CakePHP 有许多很棒的特性,但这篇评论特别关注一些真正有助于使其与众不同的特性,即:

  • 约定优于配置
  • CakePHP 的 ORM(对象关系映射)
  • 组件和助手

约定优于配置

CakePHP 一直致力于快速和一致的开发,为此,CakePHP 非常重视约定。 因此,就像 Ruby on Rails(CakePHP 的大部分灵感都来自于 Ruby)一样,CakePHP 严格遵守约定优于配置的原则。

约定意味着开发人员在学习如何使用 CakePHP 框架时不必考虑“事情的发展方向”,因为这些规则的默认设置已经到位。 虽然确实需要熟悉 CakePHP 约定,但一旦掌握,开发人员就可以专注于核心开发,而无需担心代码的放置位置和其他配置问题。

CakePHP 的约定与 PHP 本身形成鲜明对比,后者是一种相当自由的语言。 由于其约定,CakePHP 有助于确保跨多个开发人员甚至跨多个团队的编码风格和结构更加一致。 通过采用一套标准的约定,Cake 努力使开发更加一致。

例如,对于数据库模式,CakePHP 就如何命名某些变量、表名和字段做出某些默认假设。 具体来说,Cake 期望:

  • 表名将是复数(例如, orders
  • 主键字段的名称将是id
  • 任何外键字段的名称都将基于引用的表名称后跟_id (例如, customers表的外键将命名为customer_id )。

为了说明这一点,让我们考虑对博客文章数据库中的两个表( articlesusers )的简单回顾。 在我们的示例中,我们会说Articles “BelongsTo” a UsersUsers “HasMany” Articles 。 这些关系将在 CakePHP 3.0 中指定如下:

 In ArticlesTable.php: class ArticlesTable extends Table { public function initialize(array $config) { $this->belongsTo('Users'); } } In UsersTable.php: class UsersTable extends Table { public function initialize(array $config) { $this->hasMany('Articles'); } }

CakePHP 采用默认约定,因此在获取任何关联时自动知道要查找的外键(即, articles表中的user_id )。

不过,需要强调的是,CakePHP 3确实允许轻松覆盖其默认约定。 例如,假设我们在users表中的外键被称为author_id而不是user_id 。 指定它只需要对我们的代码进行以下两个小改动,让 CakePHP 知道我们没有使用默认值:

 In ArticlesTable.php: class ArticlesTable extends Table { public function initialize(array $config) { $this->belongsTo('Users' => ['foreignKey' => 'author_id']); } } In UsersTable.php: class UsersTable extends Table { public function initialize(array $config) { $this->hasMany('Articles' => ['foreignKey' => 'author_id']); } }

因此,尽管约定确实是 CakePHP 不可或缺的一部分,并且确实有它们的优势,但在必要时覆盖它们确实非常简单,正如我们在这里展示的那样。

虽然一些开发人员可能更喜欢不那么依赖约定的 PHP 框架(例如 Yii 和 Laravel),但 CakePHP 约定实际上是非常有利的。 它们可以帮助 CakePHP 开发人员在负责增强或维护其他开发人员编写的代码时显着减少启动时间,因为它们导致多个 CakePHP 开发人员和项目之间的编码结构和约定一致。

CakePHP 的对象关系映射 (ORM)

CakePHP 的对象关系映射 (ORM) 极大地受益于 CakePHP 的框架约定。 通过按照 Cake 的标准设置数据库模式,您可以通过 Cake 强大的 ORM 快速将表连接在一起。 您很少需要编写 SQL 语句,因为 CakePHP 可以轻松处理诸如表连接、 hasMany甚至hasAndBelongsToMany关系之类的事情。

利用 CakePHP 的ContainableBehavior ,通过模型关联,您可以指定从 SQL 查询中选择哪些数据库表和字段。 这可以深入几个表,并且通过 ORM 可以轻松快速地构建高度复杂的 SQL 语句。

顺便说一句,CakePHP 的ContainableBehavior是一个很好的例子,说明了 CakePHP 如何简化和简化 PHP 开发。 它可以帮助您以干净一致的方式搜索和过滤数据,还可以帮助提高应用程序的速度和整体性能。 (它通过临时或永久更改模型的关联来工作,使用提供的容器生成相应的一系列bindModelunbindModel调用。)

ORM 的挑战在于它使 SQL 的使用变得如此简单,以至于如果开发人员不小心,他或她可能会毫无意义地编写低效的 SQL 查询。 我当然多次看到写得很糟糕的 Cake 应用程序并没有简化他们的查询。 这些问题往往会在系统部署几年后浮出水面,此时数据库变得越来越大,编写错误的查询变得越来越慢。

这里的主要问题是,在最新的 CakePHP 版本 3 之前,Cake 的 ORM 默认情况下会在执行查询时检索任何关联的表。 因此,一个简单的“查找所有”查询可能会变得非常臃肿,因为底层 SQL 将从所有关联表中检索所有数据。 在版本 3 中,此行为不再是默认行为。 (在之前的 CakePHP 版本中,这个默认行为很容易通过简单地添加public $recursive = -1;到你的主AppModel.php文件来禁用。)

总的来说,对 Cake 的 ORM 的回顾表明它确实有助于简化开发,如果使用得当,它是快速构建复杂查询的绝佳工具。 尽管如此,开发人员花时间充分理解 ORM 并确保他们的查询得到适当优化(在任何语言中都是如此)是至关重要的。

组件和助手:CakePHP 库

CakePHP 的一大特色是内置库——组件和助手——消除了许多无聊、重复和乏味的开发任务。 在 MVC 上下文中,组件帮助简化控制器开发,而帮助程序简化视图编码和逻辑(即表示层)。

例如, PaginatorComponent会根据查找查询自动神奇地构建下一页/上一页界面。 添加JsHelper ,突然间你有了 AJAX 分页,由你最喜欢的 JavaScript 框架(默认为 jQuery)提供支持。

其他有用的 Helpers 的快速示例包括:

  • TimeHelper :使显示日期和时间变得轻而易举,提供了一套用于格式化和评估时间值的函数。
  • NumberHelper :为以各种常见(或自定义)格式和精度显示数字提供方便的方法。
  • TextHelper :帮助启用链接、格式化 URL、围绕所选单词或短语创建文本摘录、突出显示文本块中的关键词以及优雅地截断长段文本。

还有更多。

CakePHP 3 的批评

可以肯定的是,每个框架都有其优点和缺点,CakePHP 也不例外。 以下是本次审查之外对 CakePHP 的一些最常见的批评:

  • “传统框架; 臃肿而缓慢。” 这种批评通常更像是一种历史批评,今天的真相有限(如果有的话)。 支持早在 PHP 4 的 PHP 版本在历史上需要 CakePHP 来处理 PHP 自身的许多遗留问题。 随着 PHP 的成熟,尤其是 CakePHP 第 3 版的发布,这种说法确实失去了效力。

  • “过于严格和局限。” 虽然 CakePHP 约定有明显的优势,但仍然有人批评它们。 批评者经常争辩说这些约定过于严格,但他们没有认识到(或承认)这些约定容易被推翻。 通过采用一套标准的约定,Cake 试图使开发保持一致,考虑到 PHP 在其他方面松散的编码实践,这应该被视为一件积极的事情。

  • “缓慢的发布周期”。 缓慢的发布周期不一定是坏事。 相反,过于激进的发布周期实际上可能会带来更多问题。 事实上,CakePHP 主要版本需要时间的部分原因是为了确保与仍然广泛部署的早期版本的 PHP 向后兼容。 此外,这种保守的发布周期和对向后兼容性的强调消除了在发布新版本时对代码进行重大(和频繁)更改的需要。 还应该注意的是,对于每月发布的次要版本(错误修复、补丁、次要增强等),CakePHP 3 团队一点也不慢。 同样,大多数错误通知单在发布后的数小时内都会得到答复。

  • “不是开箱即用的解决方案。” 与许多其他现代“开箱即用的 web 应用程序”PHP 框架(例如 Yii)相比,CakePHP 有意支持和启用自定义解决方案。 在开发许多大型、自定义、数据库驱动的网站和应用程序时,我个人从中受益匪浅。

  • “使用数据数组而不是对象。” 从版本 3 开始,这不再适用。在以前的版本中,任何数据都需要作为嵌套数组进行存储和引用(例如, $user['User']['username'] )。 CakePHP 3 最终解决了这个问题,而是将数据存储为对象(例如, $user->username )。

  • “糟糕的文件。” 这种批评是有道理的,因为 CakePHP 文档似乎并不总是为初学者编写的(重要信息有时只用一两句话讨论,而几段讨论可能是有道理的)。 Cake 开发团队意识到了这一点,并正在努力相应地改进文档。 事实上,CakePHP 3 文档的主页明确声明了对文档“质量、有效性和准确性”的高度承诺。 由于 CakePHP 是一个社区驱动的框架,因此在文档的每一页上都提供了一个“改进此文档”按钮,允许并鼓励 CakePHP 用户贡献他们自己对文档的添加、删除或更正。

结论

总而言之,在其首次发布近 10 年后,对 CakePHP 的评论表明,它仍然是许多其他 PHP 框架的生机勃勃且强大的竞争对手。

CakePHP 是一个完整而全面的开发解决方案。 代码库成熟,功能似乎无穷无尽。 总体而言,Cake 的构建旨在加快开发速度,这不仅对软件开发人员很重要,对投资者也很重要。 软件开发的最大成本是开发时间成本,CakePHP 旨在显着减少开发时间。

CakePHP 是一个社区运行的项目。 随着越来越多的人参与进来,它只会变得更好。 参与 7 年并看到社区不断发展壮大,我对 CakePHP 的下一个阶段感到兴奋。 CakePHP 3 的推出,以及 PHP 和 CakePHP 的成熟,意味着该框架将继续变得越来越好。

如果您正在寻找一个基于 PHP 的解决方案,它提供许多类似于 Ruby on Rails 的优点(在易用性和约定优于配置方面),那么不妨试试 CakePHP。 不过,CakePHP 博客教程只需要几分钟的时间来设置和运行,或者,CakeCoded 提供了一系列清晰的课程来帮助 PHP 开发人员熟悉 CakePHP 并开始使用它。 通过这些资源,您将很快看到 CakePHP 可以在多大程度上加速和增强您的 PHP 软件开发工作。 享受!


Michael Houghton 是驻爱尔兰的 Toptal 工程师,拥有丰富的 CakePHP 经验。 他使用该框架开发了 100 多个网站,与 CakeDC(CakePHP 框架背后的商业实体)的团队合作,提交了各种补丁,并帮助编写了 CakePHP 文档。