Symfony与CakePHP的比较

56

symfony 和 cakephp 在概念上有什么区别?


1
如果你需要类似RoR的东西,可以尝试以下框架:
  1. Yii框架
  2. Codeigniter框架
  3. Kohana框架(从Codeigniter分支出来)
我尝试过cakephp,但感到困惑,好像不太容易处理复杂的事情。
- nightingale2k1
1
请查看最受欢迎的框架之间的比较,包括Symphony和CakePHP http://www.blog.qarea.com/web-development/top-5-php-frameworks/ - QArea
我认为这里有完整的答案 https://stackshare.io/stackups/cakephp-vs-symfony - Usman Ali Maan
9个回答

69

为了平衡这个主题,我喜欢Symfony的原因如下:

  • 使用PHP5
  • 它可以运行一些非常大的网站,比如Yahoo! Answers、delicious和Daily Motion
  • 有良好的文档。网站上的jobeet教程非常棒。它直接介绍了所有功能,并且完成后你会觉得你可以构建任何东西。
  • 高度模块化,许多Symfony组件可以独立工作。
  • 允许您选择Propel或Doctrine作为ORM。Doctrine非常好用。
  • 您可以使用YAML或PHP定义您的模型,取决于您。一些人不喜欢配置文件,如果你想避开YAML,你可以限制它们的使用。
  • 更新的Symfony cli(从1.2开始)非常棒。在此版本之前它有点奇怪,但现在它有很好的文档并遵循可预测的格式。
  • 与Ruby on Rails有很多相似之处,除了PHP当然没有Ruby那么漂亮或灵活!但是,如果你和一个Cake开发者谈论,他们可能会说相反 :)
  • Symfony admin generator比CRUD更强大,可以根据您的数据模型生成可定制的管理界面,包括列表视图(索引)、创建和编辑页面。它不像基本的crud那样,会生成源码,然后你再去修改它……实际上,你可以定义每个字段的外观、你想包含哪些字段、你可以对每个对象执行哪些额外的操作等。

从概念上讲,我认为区别在于:

  • CakePHP的学习曲线较小。如果您从未使用过MVC框架,则在短时间内选择Cake将更容易。
  • Symfony感觉有点“臃肿”,并不是说它很慢,而是在后台有很多代码可以让你在需要时做很多高级的事情。
  • 我能给出的最好建议是尝试在两个框架中快速设置自己的简单数据模型,并尝试一些基本接口,看看哪个更适合您自己的编码风格。我认为这两个框架都有非常活跃和充满激情的用户社区,您无论选择哪个都不会后悔。


    16
    自2.0版本以来,CakePHP也使用了PHP5。 - Mark Story
    3
    使用基于Cakephp构建的CMS - Croogo,您可以访问YAML以进行插件和模型管理。 - snowflake
    7
    另一个使用Symfony(2)的大型网站:YouPorn。原文链接:http://highscalability.com/blog/2012/4/2/youporn-targeting-200-million-views-a-day-and-beyond.html - Adrien Schuler

    28
    • CakePHP的哲学与Ruby on Rails类似。
    • CakePHP更适合中等规模的项目。
    • CakePHP学习起来更快。
    • CakePHP比Symfony更轻量级。
    • CakePHP的数据库交互使用CRUD。
    • CakePHP使用测试系统PHPUnit。
    • 对CakePHP Bake和脚手架很感兴趣。

    • Symfony的哲学是每个版本都不同。
    • Symfony学习起来较慢。
    • Symfony最适合大型项目。
    • Symfony的数据库交互使用Doctrine。
    • Symfony使用测试系统PHPUnit。
    • 对Symfony的Bundles和模板很感兴趣。

    2
    CakePHP 2.0 使用 PHPUnit 进行测试。 - meotimdihia
    1
    你说得对,我最近升级到了第二版,我很喜欢这个变化。 - del_dan

    22
    CakePHP和Symfony在模型创建方面有很大的不同:CakePHP模型是用PHP编写的,而Symfony模型是用YAML编写的,并由Propel提供支持。CakePHP的方法更类似于ROR的ActiveRecord(虽然它并不完全是AR实现)。总体而言,CakePHP更像Rails。
    我认为CakePHP的文档和工具面向的受众更广,语法和辅助工具也更容易使用,但他们还没有将PHP5作为其独家目标(因此自动加载并不存在)。总的来说,我更喜欢CakePHP的方法,因为它遵循了一个已经建立的标准,并且我赞赏它的组织方式。我也推荐Kohana,因为它拥有PHP5的良好特性。
    关于这个问题,Stack Overflow上还有另一篇文章,虽然它的重点有些不同。 编辑:我重新审视了Symfony,找到了我说“不”的原因,并得出了以下结论-您的意见和经验可能会有所不同: CakePHP还提供了非常简单的脚手架和易于理解的CLI工具。Symfony的CLI语法对我来说有些奇怪,“CRUD”在Symfony中也不同。再加上Symfony(笨拙的)操作语法,以及Symfony设计不佳(难以理解)的网站和偏爱第三方付费文档(亚马逊上的书籍),这就让Symfony在缺点方面更多了。

    9
    我不会说有人更喜欢第三方付费文档。亚马逊上的书籍只是他们网站上免费提供的HTML或PDF版本文档的印刷版。他们将在线文档发布出来的事实意味着在线文档符合更高的质量标准。 - stereoscott
    2
    我觉得你对Symfony的大部分负面评价都是基于个人喜好。正如上面提到的,所有Symfony书籍都可以免费在线阅读。 - Jon Winstanley
    3
    将文档以书籍的形式出版不可取,因为文档应该是一直变化的。这就是为什么CakePHP明确禁止以任何格式(除个人使用外)重新分发文档(book.cakephp.org)。由于社区成员不断更新文档,因此文档几乎总是立即过时的。如果Symfony很少更新他们的文档,那么在他们的情况下,也许这不是一个不可取的做法。 - Jose Diaz-Gonzalez
    1
    我发现他们的文档设计很差,阅读起来很困难,他们整个网站都让人感到非常不舒服。 - arbales
    1
    我在学习Symfony文档的过程中发现了几个错误。不得不去论坛澄清设置的基础知识。 - OldWest

    15

    关于CakePHP和它的局限性,有些说法是不正确的。查询是可行的,只要你知道如何做。CakePHP的"automagic"非常好用,因此你可以快速上手。它绝对是开发最快的框架(这也是为什么它被紧密地模仿RoR的原因,后者显然是一个很大的成功和轰动)。还有更高级的行为来以不同的方式返回数据,并使用一些短的方法调用和指定数组参数来完成一些更复杂的查询。

    然而,就我所知,没有其他框架有那么多的"automagic"方法和类。Cake处理最常见的任务并提供了简单的方法来完成。如果你真的聪明,你会在模型层进行大部分编码,并利用app_model和app_controller文件,使应用程序高效。

    控制台非常好且不断扩展。社区真的很棒,有许多贡献来帮助你更快地启动。你可以从架构开始,然后移动"部件"来快速构建应用程序,因为你需要的大部分东西都可以获得。你不会在任何其他框架中获得这种体验,通常你需要花费更多时间编码。

    最后,虽然文档曾经滞后,但现在要好得多了。虽然Cake在缺乏文档和版本1.1期间也遭到了一些严厉的批评...它仍然很好,只是被严重忽视了。随着1.2和即将到来的Cake2和Cake3......你会看到很多意见的改变。

    我从1.1开始使用CakePHP,并坚信它。我已经用它为大型企业网站提供服务。那些每天接收数百万次点击的网站......我们已经超出了像WordPress和Drupal这样的解决方案。当你达到这种CMS类型网站的级别时,我非常高兴有CakePHP的帮助。同样,Symfony和CodeIgniter也可以帮助你进行扩展。我对这两个框架没有任何不好的评价,我只能说你会花费更少的时间编码,并找到一个更大的社区(还有一个超级友好的IRC频道)。


    好奇现在11年后你的看法是什么 :) - ᴍᴇʜᴏᴠ
    没怎么跟上它的发展。我认为所有受Rails启发的框架都相当不错。它们之间的区别在于:1. 它们有多少臃肿(它们是否包含了你可以想到的所有实用程序,即使你最终没有使用它?还是保持简洁)和2. 设计哲学。CakePHP很快就能构建东西,因为它当时有更多的臃肿。Laravel随后出现,甚至更多-它是基于Symfony构建的。最终,过多的臃肿也导致了较慢的性能。所以我猜你得自己权衡利弊。我现在尽可能使用Golang编码并写更少的代码。 - Tom
    我很好奇。您能否详细说明(或指出一篇文章,让我可以阅读)Golang如何帮助编写更少的代码?我已经搜索了谷歌,但没有找到相关的内容。 - ᴍᴇʜᴏᴠ
    我现在写的代码比以前少了。虽然Golang确实是一种易于阅读的语言,但它并不一定会让你为应用程序编写更少的代码。 - Tom

    12

    我正在整理记录一些关于CakePHP及其一些(在某些情况下是正确的)被认为有缺陷的回应。

    CakePHP被用于许多大型网站,包括Mozilla Addons、MIT的Scratch和Hot Scripts。更详细的列表可以在CakePHP网站(http://cakephp.org)底部找到。不管怎样,只要框架不完全愚蠢(CakePHP不算太愚蠢:D),任何好的开发者都应该能够使用框架构建一个可扩展的网站。

    确实没有一个非常好的(免费)CakePHP教程涵盖了框架的每个特性,但文档非常清晰明了并详细。任何不清楚的事情都可以通过Google Group和IRC来澄清,并且我们欢迎对文档进行任何和所有的修改/更正。文档不仅仅是一个核心开发者问题,因为很多东西都是应用程序特定的,人们会想出有趣的技巧和窍门,因此每个人都受邀参与(不仅仅是评论!)。当然,所有的内容都经过了审核,所以大部分垃圾信息/垃圾邮件都不会被添加。

    代码是模块化的,因此您可以添加新的代码来替代核心功能。大部分代码只是PHP类。确实编写这样的功能可能会很麻烦,而我没有尝试使用其他类作为替补。是的,它不处理其他ORM,因此您只能使用默认的ORM,但在Cake3中应该会得到修复,届时将能够任意混合和匹配任何其他PHP类(包括Propel和Doctrine支持)。

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

    关于类似Rails,有些相似之处但也不完全相同。毕竟它们都是MVC框架,CakePHP采用了"约定优于配置"的方法。因为支持PHP4,所以语法可能没有Symfony那么优美,但仍然非常易用和直观。该框架并没有像Rails一样提供所有功能,因为它不是一个直接的克隆。CakePHP是一个框架,而不是一个库(Zend你好),因此它不会一切都预先提供。

    在CakePHP中生成视图确实有点棘手。在CakePHP1.3和2.0中对此进行了大量改进。它将支持为每个模型、视图和控制器定制模板(而不仅仅是一种视图类型)。此外,在github上有一个名为neilcrookes的用户发布了一组shell任务,可以自动烘焙特定类型(包括仅限管理员视图)的视图,这可以与自定义模板结合使用,产生您想要的结果。CSS样式也很有帮助 :) 但这肯定有待改进。

    CakePHP在其Model::find方法中使用许多不同的参数,虽然在某些情况下使用原始SQL查询可能会很有用。Model::find()方法非常灵活,在创建复杂查询方面还没有让我失望。我想这与对ORM的熟悉程度有关,这总会需要时间。

    表单验证应该在模型层中处理,因为这里执行与数据库相关的任何操作。您可以在特定视图中指定替代验证方式,或交换验证方式(有一个行为可以做到这一点,但没有它也不难)。

    多维数组有点愚蠢,但您仍然可能有多维对象。由于PHP4具有错误的对象模型,因此CakePHP不使用对象。这将在未来版本的CakePHP中得到纠正(正如我在之前的评论中指出的那样),但拥有支持PHP4的框架在某些情况下是很有用的。同样,YMMV,我同意全部采用PHP5将是一大优势,无论是应用程序速度还是开发速度。

    数据库可以自由替换。CakePHP不允许仅在一种类型的数据库中具有的功能(因此不支持仅在MySQL中存在的ENUM),以便ORM始终得到支持并且可以始终构建有效的查询。您可以在应用程序中拥有多个数据库,每个模型都有一个,可以随意交换它们甚至对于特定模型根本不使用数据库。因此,它不与特定的数据库绑定。

    最终,选择权在您手中,我全力建议您研究并阅读文档,查看组、IRC频道、博客和任何论坛,了解哪个框架最适合您的开发风格。请注意,我是一个CakePHP开发人员,所以我的帖子有一些偏见。


    9

    除了现有的答案,如果可能的话,你应该尝试两者。我经常使用两者,一段时间后,我开始更喜欢symfony。

    但我相当确信,并不是因为一个比另一个更好,而是因为symfony更适合我的思维方式,更接近我在编写框架之外的软件时所做的事情,所以更加直观。我认为其他人可能会发现他们的思维范式适合于另一个框架。

    话虽如此,我认为cakephp的对象存在一个弱点,就是通过使用数组而不是对象来实现。 (每当我需要做一些困难的事情时,这个问题就会在我内心激起一种强烈的仇恨... ! ) 它们可以完全相同,但返回表示数据的对象而不是数组,并且我想大部分问题都会消失——你将能够向数据对象中添加额外的功能,以实现我想要做的事情,而不是在现有的模型类中编写函数并传递一个数组。


    它的PHP4支持是其特色,一旦被放弃,它将完全消失。我相信CakePHP 2.0仍将支持ORM返回的对象数组,但Cake3将能够使用任何其他PHP ORM,并且本身将返回对象。 - Jose Diaz-Gonzalez

    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
    

    在cake中,使用模型的find()方法无法以一条语句完成如此微不足道的事情。

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

    还有一堆其他问题,它们都与模型层有关,包括表单验证与模型层绑定、处理混乱的多维数组、使用原始SQL和将你的应用程序绑定到特定的数据库。

    我建议使用Symfony。它是一个更大的框架,可能需要多学几天,但它一定是值得的。我曾经打算在一个项目中使用CakePHP,在遇到太多这类问题后,我转而使用Symfony,一切都很顺利。


    不可否认,Cake的Containable行为对于初学者可能会显得有些令人生畏,但它允许这种查询。 $this->Category->find('all', ['conditions' => ['Category.id' => 1], 'contain' => ['Item' => ['conditions' => ['Item.available' => 1]]]); - Simon East

    6

    另一个不同之处是:Symfony分为三个环境:开发,生产和测试-而CakePHP则没有!这使得在开发和测试产品时更加方便。


    2
    通过版本控制和单元测试,您可以确保同样的事情。 - meotimdihia

    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 {
        ...
    

    哎呀,太糟糕了。虽然这也许是面向对象技术的好方法,但它会延长开发时间(再见 RAD)。至少使用 Cake 我现在可以快速从记忆中编写大部分简单的东西。


    1
    这是早在2012年写的。我现在意识到Symfony更符合PSR标准,可能具有更好的自动加载性能(即使它可能会影响开发人员的理智!)。 - Simon East

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接