56

What is conceptually the difference between symfony and cakephp?

4

9 回答 9

69

只是为了平衡这个线程,这就是我喜欢 symfony 的原因:

  • 使用 PHP5
  • 它运行着一些非常大的网站,比如Yahoo! 答案,美味和每日运动
  • 好的文档。网站上的 jobeet 教程很棒。引导您直接完成所有功能,完成后您会觉得自己可以构建任何东西。
  • 高度模块化;许多 symfony 组件是独立工作的。
  • 允许您选择PropelDoctrine 作为您的 ORM 教义真的很棒而且易于使用。
  • 您可以使用 YAML 或 PHP 定义您的模型,这取决于您。有些人不喜欢配置文件,如果你想避开 YAML,你真的可以限制它们的使用。
  • 更新的 symfony cli(从 1.2 开始)很棒。我同意abales,在这个版本之前它有点不稳定,但现在它有很好的文档记录并且遵循可预测的格式。
  • 与 ruby​​ on rails 有很多相似之处,我的意思是很多相似之处,当然 PHP 不如 Ruby 漂亮或灵活(!)。但是,如果您与蛋糕开发人员交谈,他们可能会说相反的 :)
  • symfony 管理生成器是 CRUD(也存在于 symfony 中)的升级版,可以节省大量时间。使用您的数据模型,它将生成可定制的管理界面,包括列表视图(索引)、创建和编辑页面。它不像基本的crud,它生成源代码然后你进去修改它......你实际上可以定义每个字段的外观,你想要包含哪些字段,你可以对每个对象执行哪些额外的操作,等等。

从概念上讲,我想说的区别是:

  • CakePHP 的学习曲线更小。如果您从未使用过 MVC 框架,Cake 会在短时间内更容易上手和运行。
  • Symfony 感觉有点“大”,并不是说它很慢,而是有很多代码可以让你在需要时做很多非常高级的事情。

我能给出的最好建议是快速尝试在两者中建立自己的简单数据模型,并尝试一些基本接口,看看哪个最适合你自己的编码风格。我认为这两个框架都有非常活跃和热情的用户社区,无论哪种方式你都不会后悔你的决定。

于 2009-08-07T20:23:17.587 回答
27
  • CakePHP 的哲学类似于 Ruby on Rails。
  • CakePHP 更适合中型项目。
  • CakePHP 学起来更快。
  • CakePHP 比 symfony 更轻巧。
  • CakePHP 的数据库交互使用 CRUD。
  • CakePHP 使用测试系统 PHPUnit。
  • 在 CakePHP Bake 和脚手架方面很有趣。

  • Symfony 的理念是每个版本都是不同的。
  • Symfony 的学习速度较慢。
  • Symfony 最适合大型项目。
  • Symfony 的数据库交互使用 Doctrine。
  • Symfony 使用测试系统 PHPUnit。
  • 在 Symfony 的 Bundles 和模板中很有趣。
于 2012-01-24T23:23:30.260 回答
22

一个很大的区别在于模型的创建方式:CakePHP 模型是用 PHP 编写的,而 Symfony 模型是用 YAML 编写并由 Propel 提供支持的。CakePHP 的方法更类似于 ROR 的 ActiveRecord(尽管它不完全是 AR 实现)。一般来说,CakePHP 更像是 rails-esque。

在我看来,CakePHP 的文档和工具具有更广泛的目标受众,并且语法和帮助程序更容易,但是您还没有接受 PHP5 作为他们的唯一目标(自动加载实际上并不存在)。总的来说,我更喜欢 CakePHP 的方法,因为它有点遵循既定标准,而且我赞赏它的组织。我还推荐Kohana,因为它具有 PHP5 的优点。

关于这个问题,还有另一篇关于堆栈溢出的帖子,尽管它的重点有点不同。


编辑:我修改了 Symfony 以找到我说“不”的原因并提出了这些 - 你的意见和里程可能会有所不同:

CakePHP 还提供了非常简单的脚手架和易于理解的 CLI 工具。Symfony 的 CLI 语法对我来说有点奇怪,而 Symfony 中的 'CRUD' 就是不一样。将其与 Symfony 的 (awkard) 动作语法结合起来,并加入 Symfony 设计不佳(且难以理解)的网站,以及对 3rd 方付费文档(亚马逊上的书籍)的偏好,并且您在 cons 列中有更多的勾号。

于 2009-08-06T23:32:50.077 回答
15

上面关于 CakePHP 和限制的一些说法是不正确的。查询是可能的。你只需要知道如何制作它。CakePHP 的“自动”功能非常好,因此您可以快速上手。它是迄今为止最快的开发框架(因此它如此紧密地模仿了 RoR,这显然是一个巨大的成功和嗡嗡声)。有更高级的行为可以以不同的方式返回数据,并通过一些简短的方法调用和指定的数组参数进行一些更复杂的查询。

然而。据我所知,没有其他框架拥有如此多的“自动”方法和类。Cake 接受了最常见的任务,并提供了一种简单的方法来完成它。如果你真的很聪明,你会在模型级别完成大部分编码,并利用 app_model 和 app_controller 文件,并拥有一个非常高效的应用程序。

控制台很棒,而且一直在扩展。社区真的很棒,有很多贡献可以帮助您更快地进行。您可以从字面上构建,然后将“部分”移动到位以非常快速地构建应用程序,因为您需要的大部分内容都是可用的。任何其他框架都无法做到这一点。通常,您必须花费更多时间进行编码。

最后。虽然文档滞后,但现在好多了,虽然在缺乏文档和 1.1 版期间,Cake 也受到了一些严厉的评论......它仍然很好,只是被严重忽视了。随着 1.2 和现在的 Cake2 和 Cake3 的出现……你会看到很多意见的变化。

我从 1.1 开始就使用 CakePHP。我坚信它。我已经将它用于大型企业网站。每天收到数以百万计的点击量......我们超出了 WordPress 和 Drupal 等解决方案的范围。当您达到 CMS 类型网站的水平时,我非常高兴有 CakePHP。同样,Symfony 和 CodeIgniter 将帮助您进行扩展。我也不能对其中任何一个框架说任何坏话。我只能说你会花更少的时间编写代码,并使用 CakePHP 找到一个更大的社区(和一个超级友好的 IRC 频道)。

于 2009-08-18T01:21:21.097 回答
12

我正在浏览并记录我对上述关于 CakePHP 的评论的一些回应,其中一些是(在某些情况下是正确的)感知到的错误。

大型网站使用 CakePHP 运行,其中一些是 Mozilla Addons、麻省理工学院的 Scratch 和 Hot Scripts。在 CakePHP 网站 ( http://cakephp.org )的底部有一个更大的列表。无论如何,任何优秀的开发人员都应该能够使用框架构建一个可扩展的网站,只要该框架不是完全愚蠢的(CakePHP 不是太愚蠢:D)。

确实没有一个很好的(免费的)CakePHP 教程来介绍框架的每一个特性,但是文档的布局非常好并且冗长。任何不清楚的地方都可以通过 Google Group 和 IRC 进行清理,我们欢迎对文档进行任何和所有更改/更正。文档不仅仅是开发人员的核心问题,因为许多事情都是特定于应用程序的,人们提出了有趣的提示和技巧,因此每个人都被邀请参与贡献(不仅仅是评论!)。当然,它都是经过审核的,所以大部分垃圾/垃圾邮件都没有添加。

该代码是模块化的,您可以添加取代核心功能的新代码。大部分代码只是 PHP 类。确实,编写这样的功能可能是一种负担,而且我还没有尝试使用替代类作为填充。是的,它不处理其他 ORM,因此您只能使用默认值,但这应该在 Cake3 中修复,它可以随意混合和匹配任何其他 PHP 类(包括 Propel 和 Doctrine 支持)。

CLI 非常好,并且很容易扩展为特定于应用程序的支持。一个例子是我最近开发了一个 shell 插件,它可以自动安装我从 github 索引的任何其他 CakePHP 插件。花了大约 5 个小时来构建一些非常有用和灵活的东西。我确信 Symfony 存在这样的功能,并且它确实存在于 RoR :)

至于像 Rails 一样,它是,它不是。很多东西都是相似的,毕竟它们是 MVC 框架,而 CakePHP 采用“约定与配置”的方法。PHP4 支持具有更好的语法,Symfony 无疑是因为只支持 PHP5,但它仍然非常有用和直观。该框架没有提供开箱即用的 Rails 的所有功能,因为它不是一个直接的克隆。CakePHP 是一个框架,而不是一个库(嗨 Zend),所以它不会提供所有开箱即用的东西。

我同意,在 CakePHP 中,视图的生成有点不稳定。它在 CakePHP 1.3 和 2.0 中得到了极大的增强。它将支持每个模型、视图和控制器的自定义模板(而不是像现在这样的视图类型)。此外,在 github 上存在一组 shell 任务,用户通过 neilcrookes 自动烘焙某些类型的视图(仅包括管理视图),这些视图可以与自定义模板结合使用,以准确生成您想要的内容。CSS 样式也有帮助 :) 但这绝对是可以改进的。

CakePHP 在其 Model::find 方法中采用了许多不同的参数,尽管在某些情况下使用原始 SQL 查询可能很有用。Model::find() 方法非常灵活,就创建复杂的查找而言并没有让我失望。我想这与对 ORM 的适应有关,这不可避免地总是需要时间。

表单验证在逻辑上应该在模型层中,因为这是执行与数据库相关的任何操作的地方。您可以在我相信的特定视图中指定备用验证,或交换验证(有一种行为,但如果没有它,这样做并不难)。

多维数组有点傻,但你仍然可能有多维对象。PHP4 有一个损坏的对象模型,所以这就是 CakePHP 不使用对象的原因。这将在 CakePHP 的未来版本中得到纠正(正如我在前面的评论中指出的那样),但在某些情况下拥有一个支持 PHP4 的框架很有用。同样,YMMV 和我都同意完整的 PHP5 将是一个巨大的福音,无论是在应用程序的速度上还是在开发速度上。

数据库可以随意更换。CakePHP 不允许仅在一种类型的 DB 中固有的功能(因此放弃了对仅在 MySQL 中的 ENUM 的支持),因此 ORM 始终受到支持并且始终可以构建有效的查询。您可以在一个应用程序中拥有多个数据库,如果需要,每个模型一个,并且可以随意交换它们,甚至根本不为特定模型使用数据库。所以不,它不依赖于特定的数据库。

最后,您的选择是您自己的,我衷心建议您研究两者并通读文档,查看两者的组、IRC 频道、博客和任何论坛,看看哪个框架最适合您的开发风格。读者请注意,我是一名 CakePHP 开发人员,所以我的帖子有一些偏见。

于 2009-08-13T09:22:44.577 回答
9

除了现有的答案,如果可能的话,你应该尝试两者。我都使用了很多,并且随着时间的推移,我开始更喜欢 symfony。

但我相当确信这不是因为一个或另一个更好,而是因为 symfony 恰好更适合我的思维方式,它更接近我在框架外编写软件时所做的事情,所以感觉更直观。我希望其他人可能会发现他们的思想适合另一个框架的范式。

话虽如此,我确实认为 cakephp 的对象是一个弱点,通过使用数组而不是对象。(每当我需要做一些让我很难做的事情时,这会周期性地发展成我内心的强烈仇恨......!)他们可以做完全相同的事情,但返回对象而不是数组来表示数据,我认为大多数我遇到的问题会消失 - 您可以在数据对象中添加额外的功能来实现我想要做的事情,而不是在现有模型类中编写函数并将它们传递给数组。

于 2009-08-08T08:55:06.157 回答
6

还有一个区别是:Symfony 分为 3 个环境:开发、生产和测试——CakePHP 不能!易于同时开发和测试产品

于 2010-12-06T15:09:45.090 回答
6

CakePHP 的模型层是一团糟。尝试做一些简单的事情,例如 Category 和 Item 对象之间的多对多关系,然后检索 Category 中具有特定属性集的所有 Item。

喜欢:

SELECT items.* FROM items, categories, item_categories WHERE item.available=1 AND category.id=1 AND item_categories.category_id = category.id

使用模型的 find() 方法在蛋糕中的一个语句中不可能出现如此微不足道的事情。

核心 API 中也无法像在上面的 item_category 表中那样添加单个多对多关系。网上有几个解决方案,包括有人在面包店发布的行为(http://bakery.cakephp.org/articles/view/add-delete-habtm-behavior),但这只是像 Propel 这样的任何好的 ORM 框架的东西, Torque(Java), Hibernate(Java), SQLObject(Python), SQLAlchemy(Python) 支持开箱即用。基本上,您要么必须编写大量 PHP 代码来添加那些缺少的功能,要么使用原始 SQL 查询,但框架的主要目的是避免做这些事情,以便您可以专注于您的应用程序写作,所以你并没有真正从 CakePHP 获得太多。

还有许多其他问题,它们都与模型层有关,包括绑定到模型层的表单验证、必须处理混乱的多维数组、必须使用原始 sql 并将您的应用程序绑定到特定数据库.

我会说使用symfony。这是一个更大的框架,可能需要几天的时间来学习,但这将是非常值得的。我打算将 CakePHP 用于我正在从事的项目,在遇到太多此类问题后,我切换到了 symfony,并且进展顺利。

于 2009-08-13T05:51:16.173 回答
4

Cake 2.0 可以很好地自动加载您需要的大部分类,而我在 Symfony 2 中发现每个类都必须在脚本顶部有大量导入。试图记住所有这些导入几乎是不可能的,所以你总是需要一个方便的参考。

例如。Symfony 2 控制器代码...

namespace Acme\HelloBundle\Controller;
use Symfony\Component\HttpFoundation\Response;
// bunch of other imports accumulate here...

class HelloController {
    ...

啊,呸。虽然这对于纯粹主义者来说可能是很好的 OO 技术,但它会延长开发时间(再见 RAD)。至少有了 Cake,我现在可以快速地从记忆中编写大部分简单的东西。

于 2012-02-28T22:20:31.720 回答