两个热门的 PHP 框架 Symfony vs Laravel 详细分析对比(2018 版本)

PHP 是专注于 Web 开发的伟大且现代化的编程语言。大约 80% 的 Web 应用程序都是用 PHP 驱动的,从零开始对每个项目进行编码是不现实的,很多时候,Web 开发人员会利用各种框架和工具来加快开发速度。例如: Yii、Phalcon、Slim、或 CodeIgniter… ,但我们今天对两个 PHP 框架进行比较,即 Symfony VS Laravel。

总而言之,使用 PHP 框架的一些优点:

  • 更快的开发
  • 有组织和可复用的代码
  • Web 应用程序的可扩展性
  • 视图层和逻辑层的分离(MVC 模式下)
  • 相关的实践和工具

根据调查和最近五年(2012-2017)的 Google 趋势,Laravel 毫无疑问已经成为最流行的框架。 Symfony , 使用量第二的框架, 支持更大的项目像 Drupal CMS , 并且奇迹般地支持 Laravel。

file

接下来我们来看一下 Symfony 与 Laravel 的各项信息与我们开发项目需要在意与了解的信息。我们比较一下这两框架的的基本信息。

对比项 Symfony Laravel
出版发行时间(年) 2011 2011
当前版本 3.3 5.4
LTS + +
License (Free for commercial use) MIT License MIT License
供该框架使用的包量 7,500 16,900
基于该项目做的开源项目量 25,300 76,200
该项目在 StackOverflow 上的提问数量 51,500 67,900
Github stars ratings 14,900 7,800
贡献人数 1,400 1,400

这段译文的数据似乎已过时,译者只针对了版本,Star, Contributions 做了查阅,随着时间的推移,数值可能会有变化,请点击以下链接自行查看。
( LaravelSymfony )

总体介绍

Symfony

法国 Sensio Labs 公司的 Symfony 框架提供了大量可复用的组件,库和包。Web 开发者可以使用 Symfony 来完成如对象配置,认证,模板等任务。由于自带了很多特性,所以它熟悉起来也不是那么容易。从结构上看,它是一个灵活的全栈框架,使用 Twig 作为模板引擎。

Laravel

使得 Laravel 框架尤其伟大的是它广泛和活跃的社区,以及大量文档和教程对它各方面提供的支持。除了大量特性和『快速』构建Web的能力外,它拥有自己的模板引擎 —— Blade,和一个 PHP 的微框架 —— Lumen,用于开发 API 和其他微服务。可以查看 Laravel 社区的视频介绍。

小结

当然,两个框架都有共同之处。它们都使用 PHP 语言,在操作系统方面都跨平台,都是多用户和多语言内容。Symfony 和 Laravel 的接口都采用 MVC (model-view-controller)模式,支持文本搜索以及 scaffolding.

接下来,让我进入 Laravel 和 Symfony 的特性比较。

代码结构

Symfony 由可复用的组件组成,并提供更好的模块化。尽管这两个框架都使用 MVC 架构来开发 Web 应用程序,但 Symfony 对于复杂项目来说是更好的选择。人们可以以模块化的方式为一个项目制作大量的组件,使开发更加快速。

Symfony 与 Laravel 不同的是模板引擎。Symfony 是 Twig 而 Laravel 是 Blade 。从代码复用性方面来看, Blade 更具有优势。因为不用像 Twig 中一样两次定义相同的函数。

参数 Symfony Laravel
设计 工厂模式,组合模式,查询生成器,享元模式,观察者,依赖注入,数据映射 建造者模式,工厂,资源库模式,策略模式,提供者,Facade ,动态记录,依赖注入
兼容 REST API + (需要 FOSRestBundle) +
脚手架 + +
多语言 + +
MVC + +
HTML 模板引擎 Twig Blade
通过 composer 安装 + +
PHP 规范建议 + +
ORM + +
PhpStorm 插件及支持 + +
数据库和存储驱动程序支持 + +
全文检索 + ( ElasticSearch ) + ( ElasticSearch)
持续集成和测试 -- PHPUnit

Laravel 和 Symfony 都暗含了用于数据转换的对象关系映射( ORM )技术。两个框架多可以多种方法来安装,令开发者欣喜的是,这两个框架皆可通过 Composer 进行安装。

Continuous integration (CI)

Every time as there are changes to the code, a review is required, along with certain tests and re-configuration. CI (continuous integration) is a practice that automates such tasks aimed at errors at early stages. There are various continuous integration servers and tools within PHP environment, so let's see how our frameworks support CI services. This is round 2 of our small Symfony vs Laravel contest.

CI Service Symfony Laravel Comments
Travis Ci + + Works through Git and is not dependent on any framework.
Style CI + + Works through Git and has presets for both Symfony and Laravel.
Drone + + Works through Git and is not dependent on any framework.
Codeship + + Supports all popular PHP frameworks, works through Git, valid parameters needed.
Circle CI + + Works with all frameworks, has documentation and PHP Laravel demo.
Jenkins + + Works through Git, independent of any framework, has Laravel template.

While Jenkins seems to be quite a popular CI server, you can find self-hosted CI packages from Laravel and Symfony. Regarding database support, Symfony is considered to be a winner (NoSQL, Dynamodb, and more), and Laravel has less in its pocket.

性能和可扩展性

Symfony 和 Laravel 都缓存视图,而 Symfony 默认也缓存了源码。还记得 Laravel 是用 Symfony 构建的有趣事实吗?更有意思的是, 当 Symfony 在缓存源码的时候,Laravel 运行得更快。性能提升了不少! 顺便一提, 一个使用 Laravel 的网站的平均加载时间大约是 60 毫秒,而一个 Symfony 的网站大约是 250 毫秒。

测试用例

为了证明我们以上的分析,同时为了对比下 Symfony 和 Laravel 的性能,我们决定创建一个测试的 Web 应用。一个简单的单页应用,每个框架打开它都只需要一个动作。

这次任务的目标是:

  • 从数据库取 1,000 条记录(每条都有唯一的名称,价格和库存)
  • 为他们创建1,000 条订单
  • 更新数据库里的库存量
  • 计算订单的总价

我们做了加载测试的模拟(使用 Apache 基准)。用为物联网提供支持的最大的两个 web 服务器 —— Apache 和 Nginx。测试结果如下表格:

测试项 Symfony (秒) Laravel (秒)
Apache(10 个请求,1 个用户) 15.35 6.50
Apache(1 000 个请求,10 个用户) 638.56 202.66
NginX(10个请求,1 个用户) 7.53 6.44
NginX(1 000 个请求,10 个用户) 658.73 211.85

文档与学习曲线

在学习资料和文档方面,Laravel 远超 Symfony。Laravel 的引导和进阶视频(例如:Laracasts)覆盖了由浅入深的各个部分,且在 Laravel Github docs 上但资料范围广泛。 Symfony documentation 也描述了其在组件, 包, 服务容器等方面但内容。

方面 Symfony Laravel
学习曲线
安装复杂度
事件/通信 + +
文档 简陋 文本与视频
鉴权 + 即将到来

大量Web开发者争论说,Symfony 的学习曲线比 Laravel 要高一点(高很多)。Laravel 感觉更直观切更适合构建后端 Web 项目,且更契合类似 Angular 之类的前端 JavaScript 框架。

Symfony vs Laravel: 总结

坦率的讲,laravel 最近几个月发展势头强劲。它更适合用于那种投入资源更少但发布更快的大型 web 项目。与此同时,Symfony 更适合构建企业级的 web 项目,但是也要求开发者拥有更高级的技能。

Laravel 是 PHP 生态系统中最强有力的竞争者,因为它具备构建现代化 web 应用的必备特性。

Laravel 的创始人是 Taylor Otwell。

总结一下,Symfony 的主要优点是:

  • 多种扩展选项
  • 比大多数 PHP 框架快
  • 适应性和最佳性能(以 HTTP 为中心的请求 / 响应)
  • 可复用组件节约时间和节省成本

而 Laravel 框架的主要优点则是:

  • 高级的查询构造器机制
  • 数据的无痛迁移与整体管理
  • 自动加载能力(无需手动维护)
  • 更简单的认证机制
  • 使用事件对象原则来代替事件字符串处理程序的新事件。

选哪一个决定权在你手中。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://thinkmobiles.com/blog/symfony-vs...

译文地址:https://learnku.com/laravel/t/9236/two-p...

本帖已被设为精华帖!
本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 6

原作者写这篇文章的时候很明显是带着偏向性的情绪,写了很多不实的东西;

Symfony 缺少持续集成和测试

不知道作者表达的意思,如果是说 Symfony 没有单元测试的话,那么看这里 https://travis-ci.org/symfony;Symfony的组件中单元测试的代码量和源代码量基本是持平的。

Symfony 的文档简陋:

Rst文档仓库 https://github.com/symfony/symfony-docs;如果感受不够直观可以看官网文档 http://symfony.com/doc/current/index.html ;我认为这样的文档不能称之为“简陋”,如果这样的文档也叫简陋的话那 laravel 的文档还能看吗。

从代码复用性方面来看, Blade 更具有优势。因为不用像 Twig 中一样两次定义相同的函数。

“因为不用像 Twig 中一样两次定义相同的函数” 这句话不知从何而来;Twig 是个易扩展的架构,不管是 tag, function, filter 除了内置还可以自定义自己的,也许是这一点让作者有了两次定义相同函数的机会;支持自定义的功能做法没有错,但你用错了是你自己的问题。

Twig 是一个现代化的模板引擎,如果你用过python的 jinja, javascript nunjunks 你会发现它们的语法都是一样的;以后模板引擎的趋势大家心里该有一杆秤。

关于 ORM

Symfony 的ORM是基于 Doctrine 的,Doctrine遵循的是标准的 entity/repository 模式与 Eloquent 的 Active Record 不同;有人喜欢 AR 的简单易用有人喜欢 entity/repository 设计感;

高级的查询构造器机制
数据的无痛迁移与整体管理
自动加载能力(无需手动维护)

这是表示 Symfony 没有吗? https://github.com/doctrine 看这里;

更简单的认证机制
在 Symfony 中认证与授权是被抽象成防火墙,是架构在应用之外的高度抽象的东西,如果你理解不了这种抽象你依然可以选择 Guard 这种简单的授权方式,它是官方提供的 Firewall 用法的语法糖,这个可能符合作者的 “更简单”。

@Summer 翻译文章确实是蛮好的行为,但翻译的质量还是希望能够保证一下;我不觉得这种无脑喷的文章有什么意义;也希望写这种对比文章的同学能够更客观一点。

5年前 评论
kis龍 4年前

原作者写这篇文章的时候很明显是带着偏向性的情绪,写了很多不实的东西;

Symfony 缺少持续集成和测试

不知道作者表达的意思,如果是说 Symfony 没有单元测试的话,那么看这里 https://travis-ci.org/symfony;Symfony的组件中单元测试的代码量和源代码量基本是持平的。

Symfony 的文档简陋:

Rst文档仓库 https://github.com/symfony/symfony-docs;如果感受不够直观可以看官网文档 http://symfony.com/doc/current/index.html ;我认为这样的文档不能称之为“简陋”,如果这样的文档也叫简陋的话那 laravel 的文档还能看吗。

从代码复用性方面来看, Blade 更具有优势。因为不用像 Twig 中一样两次定义相同的函数。

“因为不用像 Twig 中一样两次定义相同的函数” 这句话不知从何而来;Twig 是个易扩展的架构,不管是 tag, function, filter 除了内置还可以自定义自己的,也许是这一点让作者有了两次定义相同函数的机会;支持自定义的功能做法没有错,但你用错了是你自己的问题。

Twig 是一个现代化的模板引擎,如果你用过python的 jinja, javascript nunjunks 你会发现它们的语法都是一样的;以后模板引擎的趋势大家心里该有一杆秤。

关于 ORM

Symfony 的ORM是基于 Doctrine 的,Doctrine遵循的是标准的 entity/repository 模式与 Eloquent 的 Active Record 不同;有人喜欢 AR 的简单易用有人喜欢 entity/repository 设计感;

高级的查询构造器机制
数据的无痛迁移与整体管理
自动加载能力(无需手动维护)

这是表示 Symfony 没有吗? https://github.com/doctrine 看这里;

更简单的认证机制
在 Symfony 中认证与授权是被抽象成防火墙,是架构在应用之外的高度抽象的东西,如果你理解不了这种抽象你依然可以选择 Guard 这种简单的授权方式,它是官方提供的 Firewall 用法的语法糖,这个可能符合作者的 “更简单”。

@Summer 翻译文章确实是蛮好的行为,但翻译的质量还是希望能够保证一下;我不觉得这种无脑喷的文章有什么意义;也希望写这种对比文章的同学能够更客观一点。

5年前 评论
kis龍 4年前
Summer

@Tao 这篇文章踩的点不错,告诉我们在选择框架时,需要审视哪些点,这是我选择翻译这篇文章的初衷。

每一个人的认知都是有限的,这注定了一个人的观点无法得到所有人的认同,有时候同一段话,不同认知的人理解也是不一样的。所以文章里有一些你认为的错误,是在所难免的,你指出来即可,一起讨论一起成长即可。

例如说 Symfony 文档简陋 这个事,其实是和 Laravel 的拥有 视频(laracasts.com) + 文档 相对比的。你应该知道 laracasts.com ,如果视频与文字文档加在一起统称 文档,Symfony 的文档确实要弱些。

不过还是感谢你的辩论,我就认为蛮精彩的 :+1: ,又多了一个有经验的视角来分享知识嘛。

至于你说的无脑喷,言重了。

5年前 评论
kis龍 4年前

Symfony的文档比laravel的解释说明型语句要多一些

5年前 评论

我记得laravel底层是Symfony 吧,在别人的框架上建东西,还说人家的东西不好,希望客观一点

5年前 评论
No_Panic

Symfony也有Symfonycasts嗷,还有字幕功能,老给劲儿了 :+1:

4年前 评论

不得不说,面向现代化的企业级的 PHP 开发框架当属 Symfony 。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!