CakePHP适用于大型项目

时间:2011-02-10 10:52:58

标签: php cakephp frameworks

我们正在为一个高效的网站评估一些PHP框架。 CakePHP看起来很有趣,但我们不知道它是否符合我们的需求。

基本上,当您查看CakePHP的文档和教程时,它看起来非常有前途。然而到目前为止,总有一些东西让我对框架产生了麻烦,也许已经在生产项目中使用CakePHP的人可以为我回答这个问题?

  • 在CakePHP中,单个记录的写入/读取数据看起来非常简洁。如果您想从具有复杂条件的多个表中读取数据,group by,where子句会发生什么? CakePHP如何处理它?<​​/ li>
  • 脚手架看起来非常适合基本的管理界面。定制这些东西有多容易。假设我的一张桌子上有一个外键。当我创建一个脚手架页面时,CakePHP会自动为我创建一个包含所有可能项目的下拉列表吗?如果我想过滤可能的项目怎么办?假设我想将两个字段组合到视图部分中的一个字段中,但是当我编辑它时,我应该能够单独编辑这两个字段。这有用吗?
  • 你认为使用CakePHP开发的速度比使用普通的PHP更快吗?

6 个答案:

答案 0 :(得分:8)

我已经使用了CakePHP,Zend Framework,我还“从头开始”编写应用程序,只不过是本土类等。为此,我想提一下我经常使用CakePHP,所以请按照你的意愿去做。

  • 写作/阅读数据,复杂条件)你当然可以做你提到的一切。其他人是正确的,因为它试图为你抽象出SQL操作。我还没有查询到我无法翻译成Cake的“用语”;复杂的地理空间查询,连接等

  • 脚手架,复杂的条件)脚手架实际上只是作为各种“跳跃开始”,以帮助确保您的模型关联等设置正确,不应该用作永久解决方案。为此,是的,它会在反省您的人际关系和提供相关标记方面做得相当不错。

  • 更快的开发)当然。有一个庞大的社区,有大量的插件或示例可以帮助您入门。无论你选择什么,选择一个框架几乎肯定会让你“更快”,只是为了处理设置应用程序时的细节。

答案 1 :(得分:8)

这实际上取决于你对“大”的定义。你指的是大数据集吗?一个非常复杂的领域模型?或者只是很多不同的控制器/动作?

写作/阅读数据

您可以在CakePHP中使用纯SQL执行任何操作。它可能并不总是很好,但最糟糕的是它并不比直接SQL差。

但你真的不应该考虑查询。您应该考虑您的域模型。 CakePHP实现了活动记录模式。如果您的域模型很好地映射到活动记录模式,它的效果非常好。但如果没有,那么我不会推荐CakePHP。如果您的域模型没有映射到Active Record,那么您将花费大量时间来对抗Cake的做事方式。这没什么好玩的。使用实现Data Mapper模式的框架(例如Zend)会更好。

脚手架

脚手架是暂时的。它确实处理外键(如果你在模型和数据库中定义它们),但就是这样。你不能修改脚手架。但是,你可以烘烤它们!

当您烘焙控制器或视图时,您基本上将脚手架写入文件作为您自己实现的跳转点。烘焙后,您可以做任何您想做的事情。烘焙的缺点是,当模型或数据库发生变化时,它不再更新。因此,如果您烘焙控制器和视图并向模型添加字段,则需要手动将这些字段添加到控制器并查看代码。

发展速度

在我的情况下,我在使用CakePHP开发网站然后用普通代码加快了。但只有Active Record适合应用程序!看到我的第一点。即便如此,Cake可能仍然更快,但我会更快地拥有更好的适应框架。

其他一些想法

大型数据集

如果你有非常大的数据集和大的查询结果,那么Cake可能是个问题。 find()操作想要返回一个关联数组,因此所有行都被读取,解析并转换为数组。如果结果集太大,则内存不足。 CakePHP没有像许多其他Active Record实现那样实现ResultSet对象,这是一个明确的缺点。您最终使用子查询手动分页您自己的数据。呸。我带来了下一点:

阵列

学会爱上他们因为CakePHP。一切都是一个阵列,往往是大而复杂和深刻的。一段时间后它真的很烦人。您无法向数组添加函数,因此您的代码比CakePHP使用嵌套对象实例时更加混乱。您可以添加到这些对象的函数可以帮助您保持代码清洁。

奇怪和不一致

CakePHP内部隐藏着一些真正讨厌的指针。如果Active Record适合您的应用程序,那么您可能永远不会碰到它们,但如果您尝试将CakePHP塑造成更复杂的东西,那么您将不得不对抗这些。一些例子:

  • HABTM通过自定义模型使用您正在处理的关系另一侧的定义。
  • 一些非常奇怪的地方,你的前/后触发器没有被调用(例如,不是来自updateAll)
  • odd Model-&gt; field()行为。它始终从数据库查询。因此,请小心更新模型数据,而不立即将其保存到数据库中。一些CakePHP函数从Model-&gt; $ _ data获取数据,一些使用Model-&gt; field()。结果可能完全不同,导致一些非常难以追踪的错误。

简而言之

我强烈推荐CakePHP,即使是“大型”网站,只要您的域模型非常适合Active Record。如果没有,请选择不同的框架。

答案 2 :(得分:3)

既然你在征求意见,那么我不得不说我建议反对CakePHP

我最大的抱怨是,它仍在使用PHP4(编写和代码生成)。那么,为什么要倒退呢?它与PHP5兼容,但框架本身围绕PHP4。

我建议您查看SymfonyZend。如果你想要更多的结构,Symfony是最好的 - 它迫使你坚持它已经建立的MVC结构。

替代方案是Zend,但它更像是一个“自己动手”的框架,或者说更多的是一组库。你需要自己把它们放在一起,它没有像Symfony那样严格的结构。

显然还有其他框架,但我建议前面说过。您可能想要查看的另一个是Codeigniter

答案 3 :(得分:2)

CakePHP尝试抽象出数据库,因此你编写的SQL很少(但是,你编写了很多SQL代码片段)。

基本过程是定义模型,然后定义模型之间的关系(hasOne,belongsTo,hasMany,hasAndBelongsToMany)。您可以在这些关联中添加任何条件或默认排序。然后,每当从数据库中获取一行时,将自动使用它获取任何关联的行。它非常简单而且功能强大。

所有功能都配备了一系列配置选项,提供了更大的灵活性。例如,在获取数据时,存在一个取整数的递归选项。这个值是深度Cake应该获取数据的关联数量。因此,如果您想要获取具有所有相关数据的用户以及所有已加入的数据,那么这很简单。

几乎所有东西都可以在动态定义时被覆盖,并且你总是可以回过头来编写自己的SQL,所以Cake没有阻止你做任何事情......

我没有找到太多用于脚手架的东西。你的问题的答案是肯定的,它会自动填充连接下拉列表等。但我从来没有用它作为构建界面的基础。我倾向于使用数据库工具尽早填充数据而不是脚手架。

我已经在CakePHP上构建并维护了几个Web应用程序,毫无疑问比“滚动自己”更快。但我认为任何体面的框架都是如此!

不幸的是,其中一个弱点是文档。通常你需要谷歌寻求答案,因为官方文件有时会有点昙花一现。

答案 4 :(得分:1)

只需使用Yii框架,它就是此类别中最好的。

答案 5 :(得分:0)

(注意:这是一个主观问题。你在征求意见。所以我希望你不介意我是否给我。)

(编辑:Ops。我将蛋糕与CI混合)

我曾经使用过Code Igniter。它做了应有的一切,并且相当容易理解。但是,对于大型项目,它缺乏功能。许多CI支持者表示,这是它的优势,因为它可以保持快速并且可以节省大量内存。这是真的。

但是,在用它开发一个应用程序之后,我发现自己在寻找其他地方,所以我不必编写必须之前编写过的代码。我看了CakePHP,发现它太具有限制性和自动性。特别是,我需要某种ACL功能。这引出了我对Zend Framework的看法。我了解到它松散耦合。我只能包含我需要的文件。我也可以将Zend_Application用于大型项目。在开发和维护大型项目时,面向对象的设计是必不可少的。

是的,CI和CakePHP帮助我比使用普通PHP更快地开发。但是,有更强大的框架。我听到并看到了关于Symphony的好东西。还有更多。我相信别人会指出它们。