symfony 和 cakephp 在概念上有什么区别?
symfony 和 cakephp 在概念上有什么区别?
为了平衡这个主题,我喜欢Symfony的原因如下:
从概念上讲,我认为区别在于:
我能给出的最好建议是尝试在两个框架中快速设置自己的简单数据模型,并尝试一些基本接口,看看哪个更适合您自己的编码风格。我认为这两个框架都有非常活跃和充满激情的用户社区,您无论选择哪个都不会后悔。
关于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频道)。
我正在整理记录一些关于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开发人员,所以我的帖子有一些偏见。
除了现有的答案,如果可能的话,你应该尝试两者。我经常使用两者,一段时间后,我开始更喜欢symfony。
但我相当确信,并不是因为一个比另一个更好,而是因为symfony更适合我的思维方式,更接近我在编写框架之外的软件时所做的事情,所以更加直观。我认为其他人可能会发现他们的思维范式适合于另一个框架。
话虽如此,我认为cakephp的对象存在一个弱点,就是通过使用数组而不是对象来实现。 (每当我需要做一些困难的事情时,这个问题就会在我内心激起一种强烈的仇恨... ! ) 它们可以完全相同,但返回表示数据的对象而不是数组,并且我想大部分问题都会消失——你将能够向数据对象中添加额外的功能,以实现我想要做的事情,而不是在现有的模型类中编写函数并传递一个数组。
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,一切都很顺利。
Containable
行为对于初学者可能会显得有些令人生畏,但它允许这种查询。
$this->Category->find('all', ['conditions' => ['Category.id' => 1], 'contain' => ['Item' => ['conditions' => ['Item.available' => 1]]]);
- Simon East另一个不同之处是:Symfony分为三个环境:开发,生产和测试-而CakePHP则没有!这使得在开发和测试产品时更加方便。
namespace Acme\HelloBundle\Controller;
use Symfony\Component\HttpFoundation\Response;
// bunch of other imports accumulate here...
class HelloController {
...
哎呀,太糟糕了。虽然这也许是面向对象技术的好方法,但它会延长开发时间(再见 RAD)。至少使用 Cake 我现在可以快速从记忆中编写大部分简单的东西。