作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
迈克尔·霍顿的头像

迈克尔•霍顿

Michael是一名拥有13年以上经验的全栈开发人员. 他对PHP很有经验 & Vue.js.

专业知识

以前在

Apple
Share

在过去的一个月里 CakePHP 团队宣布推出的alpha版本 CakePHP 3. Cake开发团队认为版本3将改变游戏规则, 因此,随着版本3的alpha发布,现在刚刚出炉, 本文重新审视了CakePHP 3作为PHP开发的一个有效的现代框架.

这款蛋糕是刚出炉的.

简史

如今,有很多选择,当涉及到 PHP开发. 随着PHP的成熟, 越来越多的PHP框架出现了, 为开发人员提供广泛的选择. 但情况并非一直如此.

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

CakePHP框架到底有多流行? 它是GitHub上最受欢迎的4个PHP项目之一, 大约130个,000个项目, 18岁以上,在CakePHP谷歌组的000名成员中有32,000年的主题. 有270个代码贡献者, 还有320位文档贡献者, 不可否认,CakePHP拥有大量的追随者. CakePHP目前的广泛和日益流行在一篇文章中得到了很好的总结 詹姆斯•瓦特, CakePHP的核心成员和社区经理 饼软件基金会我在写这篇文章的过程中采访了他.

现在该框架的版本3已经可用, CakePHP无疑有望继续成为PHP世界的领导力量,并成为当今各种PHP框架中的主要竞争者.

CakePHP第3版有什么新功能?

本评论基于CakePHP 3的alpha版本.0,它包含了许多新功能和增强功能,包括:

  • 更好的性能. 版本3对引导过程进行了性能改进, 路由过程, 以及生成助手模板的过程的几个部分.

  • 增强的组件和帮助程序. 版本3增强了对“flash消息”的支持 FlashHelper and FlashComponent. 此外, CookieComponent 已得到加强, 更容易分离cookie名称空间的配置和cookie数据的处理.

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

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

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

  • ORM的改进. 的几个API进行了更改 对象关系映射. 最明显的是, 现在更容易为保存操作指定深度关联, 并且已经改变了一些约定,以减少新采用者的学习曲线和困惑.

除了, 还有一些额外的特性也计划被纳入到版本3的测试版中.0. 最重要的是:

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

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

为什么CakePHP?

CakePHP有很多很棒的特性, 这篇评论特别关注了一些真正有助于区分它的东西, namely:

约定优于配置

CakePHP一直致力于快速和一致的开发, 为了这个目的, CakePHP非常强调约定. 因此,像 Ruby on Rails (CakePHP从中汲取了很多灵感),CakePHP严格遵循 约定优于配置 原则.

约定意味着开发人员在学习如何使用时不必考虑“东西往哪里去” CakePHP框架,因为这些规则的默认值已经设置到位. 虽然需要熟悉CakePHP约定, 一旦掌握了, 开发者可以专注于核心开发, 而不需要担心代码放置的位置和其他配置问题.

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

对于数据库模式, 例如, CakePHP对某些变量如何进行默认假设, 表名, 字段将被命名. 具体来说,Cake期望:

  • 表名将采用复数形式(例如.g., orders)
  • 主键字段的名称将是 id
  • 任何外键字段的名称都将基于引用的表名,后面跟着 _id (e.g.,将外键转换为 客户 表将被命名为 customer_id).

为了说明这一点,让我们简单回顾一下两个表(文章 and users)从博客文章数据库. 在我们的例子中,我们会说an 文章 “BelongsTo” Users, and a Users “HasMany” 文章. 这些关系将在CakePHP 3中指定如下.0:

在文章Table.php:
    类文章Table扩展表{
        公共函数initialize(array $config) {
            $this->belongsTo('Users');
        }
   }

在UsersTable.php:
    类UsersTable扩展表{
        公共函数initialize(array $config) {
            $this->hasMany('文章');
        }
    }

CakePHP采用默认约定,因此自动知道要查找哪些外键.e., user_id in the 文章 表)获取任何关联时.

但是,必须强调的是,CakePHP 3 does 允许它的默认约定很容易被重写. 例如,我们的外键 users 表被称为 author_id 而不是 user_id. 指定此值只需要对我们的代码进行以下两个小更改,以让CakePHP知道我们没有使用默认值:

在文章Table.php:
    类文章Table扩展表{
        公共函数initialize(array $config) {
            $this->belongsTo('Users' => ['foreignKey' => 'author_id']);
        }
   }

在UsersTable.php:
    类UsersTable扩展表{
        公共函数initialize(array $config) {
            $this->hasMany('文章' => ['foreignKey' => 'author_id']);
        }
    }

So, 尽管约定确实是CakePHP不可或缺的一部分,并且确实有其优势, 必要时重写它们非常简单, 正如我们在这里展示的.

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

CakePHP的对象关系映射(ORM)

CakePHP的对象关系映射(ORM)从CakePHP的框架约定中受益匪浅. 通过按照Cake的标准设置数据库模式, 您可以通过Cake强大的ORM快速地将表连接在一起. 你几乎不需要编写SQL语句,因为CakePHP可以处理表连接, hasMany,甚至 hasAndBelongsToMany 轻松的关系.

充分利用CakePHP的 ContainableBehavior, 通过模型关联,您可以指定要从SQL查询中选择哪些数据库表和字段. 这可以深入到几张表, 通过ORM可以很容易地快速构建高度复杂的SQL语句.

顺便说一句,CakePHP的 ContainableBehavior 是CakePHP如何简化和流线化PHP开发的一个很好的例子. 它可以帮助您以干净一致的方式搜索和过滤数据,还可以帮助提高应用程序的速度和整体性能. (它的工作原理是暂时或永久地改变你的模型的关联, 使用提供的容器生成一系列对应的 bindModel and unbindModel calls.)

ORM的挑战在于,它使使用SQL变得如此简单, 如果开发者不小心, 他或她可以无意地编写低效的SQL查询. 我确实见过很多写得很差的Cake应用程序,它们没有简化它们的查询. 这些问题往往会在系统部署几年后浮出水面, 当数据库变大时,写得不好的查询会变得越来越慢.

这里的主要问题是, 在最新的CakePHP版本3之前, Cake的ORM将默认检索 any 执行查询时关联的表. 结果是, 一个简单的“查找所有”查询可能会变得非常臃肿,因为底层SQL会进行检索 all 数据从 all 相关的表. 在版本3中,这种行为不再是默认的. (在CakePHP的早期版本中,这种默认行为很容易通过添加 Public $recursive = -1; 到你的主 AppModel的.php file.)

Overall, 对Cake的ORM的回顾表明,它确实有助于简化开发流程, 如果使用得当, 是一个快速构建复杂查询的神奇工具吗. 尽管如此,开发人员花时间完全理解ORM并确保他们的查询得到适当优化(在任何语言中都是如此)是至关重要的。.

组件和帮助程序:CakePHP库

CakePHP的一个重要特性是内置的库——组件和助手——消除了许多无聊的东西, 重复的, 繁琐的开发任务. 在MVC上下文中, 组件 帮助简化控制器开发,同时 Helpers 简化视图编码和逻辑(例如.e.(表示层).

The PaginatorComponent例如,它会根据查找查询自动生成下一页/上一页界面. Add the JsHelper突然之间,你有了AJAX分页,由你最喜欢的JavaScript框架(jQuery 默认情况下).

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

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

这里有 更多的.

对CakePHP 3的批评

可以肯定的是,每个框架都有其优缺点,CakePHP也不例外. 以下是本文之外对CakePHP最常见的批评:

  • “Legacy 框架; bloated and slow.” 这种批评通常更多的是历史上的,今天的真理有限(如果有的话). 从历史上看,支持早至PHP 4的PHP版本需要CakePHP处理许多PHP自己的遗留问题. 随着PHP的成熟, 特别是随着CakePHP版本3的发布, 这一指控确实已经失去了效力.

  • “过于严格和限制.” 尽管CakePHP约定有明显的优点, 尽管如此,还是有人批评他们. 批评者经常认为这些公约过于严格, 但他们没有认识到(或承认)这些惯例 can 很容易被覆盖. 通过采用一套标准的约定, 饼看使发展一致哪, 考虑到PHP松散的编码实践, 应该只被看作是积极的事情吗.

  • “慢释放周期”. 缓慢的发布周期并不一定是坏事. 相反,过于激进的发布周期实际上会带来更多问题. In fact, CakePHP主版本需要时间的部分原因是为了确保与仍在广泛部署的早期PHP版本的向后兼容性. Moreover, 这种保守的发布周期和对向后兼容性的强调消除了在发布新版本时对代码进行重大(和频繁)更改的需要. 还应该注意到CakePHP 3团队是任何东西 but 当涉及到小版本(bug修复、补丁、小增强等)时,速度很慢.),并将其释放 monthly. 类似地,大多数错误票在内部得到回答 hours 被张贴的.

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

  • "使用数据数组而不是对象.” 从版本3开始,这不再是正确的. 在以前的版本中,任何数据都需要以嵌套数组的形式存储和引用.g., $ user(“用户”)(“用户”)). CakePHP 3最终解决了这个问题,而是将数据存储为对象.g., $user->username).

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

结论

最重要的, 距离首次发布已经过去了近10年, 对CakePHP的回顾表明,它仍然是自出现以来许多其他PHP框架的一个充满活力和强大的竞争者.

CakePHP是一个完整而全面的开发解决方案. 代码库是成熟的,功能似乎无穷无尽. Overall, 蛋糕的建立使得发展迅速, 哪些不仅对软件开发人员重要, 对投资者来说也是如此. 软件开发的最大成本是开发时间的成本, CakePHP旨在显著缩短开发时间.

CakePHP是一个社区运行的项目. 随着越来越多的人参与进来,它只会变得更好. 我已经参与了7年,见证了社区的不断发展, 我对CakePHP的下一个阶段感到兴奋. CakePHP 3的发布, 以及PHP和CakePHP的成熟, 意味着框架会继续变得越来越好.

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


迈克尔•霍顿 is a Toptal 爱尔兰工程师,拥有丰富的CakePHP经验. 他已经使用该框架开发了100多个网站,与团队在 CakeDC (CakePHP框架背后的商业实体), 提交了各种补丁, 并帮助编写了CakePHP文档.

聘请Toptal这方面的专家.
现在雇佣
迈克尔·霍顿的头像
迈克尔•霍顿

位于 爱尔兰利默里克,

成员自 2014年4月21日

作者简介

Michael是一名拥有13年以上经验的全栈开发人员. 他对PHP很有经验 & Vue.js.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

专业知识

以前在

Apple

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

Toptal开发者

加入总冠军® 社区.