目录
长话短说
微服务的出现
单体应用的破坏
可扩展性
结论
关于 PHP MVC 框架的常见问题
什么是 PHP 中的 MVC 框架?
为什么我应该使用 MVC 框架进行 PHP 开发?
2017 年最顶尖的 PHP MVC 框架是什么?
如何为我的项目选择合适的 PHP MVC 框架?
MVC 模式如何在 PHP 框架中工作?
什么是 Laravel,为什么它如此受欢迎?
PHP MVC 框架的学习曲线如何?
我可以在没有 MVC 框架的情况下使用 PHP 吗?
什么是 PHP MVC 框架中的数据库抽象?
如何开始使用 PHP MVC 框架?
首页 后端开发 php教程 2017年PHP MVC框架的状态

2017年PHP MVC框架的状态

Feb 10, 2025 pm 03:32 PM

The State of PHP MVC Frameworks in 2017

关键要点

  • Laravel 和 Symfony 目前是领先的 PHP MVC 框架,拥有强大的社区和持续开发的新功能。
  • 微服务和基于容器的架构的兴起正在改变 MVC 的作用,转向将应用程序构建为“函数”。
  • 虽然 Laravel 处于领先地位,但大型 Eloquent 模型和过多的服务可能会使其变得复杂,从而导致单体应用的产生。
  • Symfony 虽然有时会导致单体应用程序,但它通过使用存储库提供了优雅性和灵活性。
  • 微服务的出现并不意味着 PHP 正在消亡,但开发人员应该保持领先地位,并考虑学习 GoLang 或 Node.js。

本文最初发表于 ZenOfCoding,经作者许可在此重新发布。


The State of PHP MVC Frameworks in 2017 一个简单的问题促使我坐下来撰写这篇对我大约一年前的文章的后续文章。

问:您对目前的情况有何看法?(2017年2月24日)

答:“我认为现在主要取决于 Laravel 和 Symfony;就 PHP 框架而言。如果您要启动一个新项目,我认为使用 CakePHP、Zend、CodeIgniter、Yii 等没有任何特别的价值。 只有当您已经了解这些框架或拥有习惯使用它们的开发人员时,我才能看到使用它们的理由。 当真正的开发开始时,您必须能够找到工具、插件和常见问题的答案。凭借 Laravel 和 Symfony 社区以及新“模块”或功能的持续开发,您永远不会感到落后。仅 Laracasts(即使您不使用 Laravel 进行开发)就非常棒。

无论是与 iron.io 或其他 SaaS 提供商等服务的集成,对各种数据源的支持,还是像 Homestead 这样的本地开发环境,这些框架和支持模块都更具前瞻性。

Lumen 补充了快速 API 开发,Laravel 确实成为当今快速应用程序开发和原型设计的绝佳方法。这并不是说它在构建大型应用程序时受到某种限制。

然而,总的来说,我们确实看到了向基于容器的架构的转变,其中 MVC 的作用要小得多。一切都是关于微服务、编排和将应用程序构建为“函数”(即 AWS Lambda 和类似服务)。也许是时候提高您的 Node.js 和 GoLang 技能了 :)”

虽然我对这个答案总体上感到满意,但我还是忍不住认为,详细阐述其中一些要点并重新审视现状是个好主意。

在我开始讨论“GoLang”等奇怪主题之前,让我们先退一步,看看 2017 年 PHP MVC 框架领域的趋势。

The State of PHP MVC Frameworks in 2017

我认为我们过去观察到的趋势正在持续。Laravel 仍在不断发展,而其他人则落后了。Symfony 的流行度略有上升,这可能是由于备受期待的 Symfony 3 版本发布。

(我尝试了更具体的比较搜索,例如“CakePHP 3”或“ZF2”,但这些搜索并未产生具有统计意义的趋势)。

今年我加入了 CodeIgniter,因为它非常流行,这一点很明显。我收到了许多关于 CodeIgniter 的问题,以及我对其在 PHP MVC 社区中的地位的看法…… 简而言之,CI 仍然没有参与竞争,因为它不是真正的 MVC 框架。除了组织良好的 POPO 集合之外,我不知道该如何称呼它……

让我们直接引用他们的手册中的这句话:

CodeIgniter 对 MVC 采取了相当宽松的方法,因为不需要模型。如果您不需要额外的分离,或者发现维护模型比您想要的更复杂,您可以忽略它们并使用控制器和视图以最小的方式构建您的应用程序。

在构建框架方面,我完全不同意这种方法。也许它是一个不错的样板,这就是 CodeIgniter 流行的原因,但是框架必须强制执行某些纪律,否则最终产品将成为一堆意大利面条代码,包裹在某种“模式”中。

接下来,Symfony 3 为我们带来了开发人员体验、依赖注入和许多其他功能的一些改进。与许多 PHP 对应产品一样,它现在提供了一个微框架。相比之下,ZF3 提供了一系列改进,例如对 PHP7 的支持(最终)甚至它自己的微框架……但正如他们的手册所说:

对于 Zend Framework 2 MVC 用户来说,差异很细微……

我真的很希望他们说差异很大,有一些重大的架构改进,以及一些帮助您以现代方式开发事物的精彩新模块。唉,在大多数情况下,ZF3 与 ZF2 仍然非常相似。

长话短说

这就是我今天看待 PHP 框架世界的方式:

  1. Symfony 或 Laravel,取决于您的需求
  2. 其他的

毫无疑问,Laravel 抢尽了风头。可用信息的数量、Laracasts、全球开发人员人才、简单的模式实现、集成的测试工具集、Eloquent 形式的活动记录实现、Lumen 中的轻量级版本、使用 Homestead(Vagrant)的本地开发使这个框架对于新手和经验丰富的开发人员来说都非常突出。

但是 Eloquent 模型可能会变得杂乱无章且相当庞大,可能会创建过多的 Laravel 服务(不要与微服务混淆),人们开始考虑在不合适的地方实现存储库模式。因此,单体应用诞生了。

如果您不熟悉活动记录模式并且需要存储库的额外灵活性,或者您不喜欢看到太多匿名函数,那么请使用 Symfony Doctrine。 我是否认为 Symfony 是通往单体应用程序的途径?在某种程度上,是的。但是,它可能是最优雅的一个。

总的来说,我不会称其为与去年相比的剧烈变化。尽管如此,我们仍然需要从更大的角度来看待问题:一个设计良好的应用程序不仅仅是 MVC;它还涉及基础设施、部署管道、解耦架构。所有这些都可以在 MVC 堆栈中实现,但是需要格外注意避免单体应用。

微服务的出现

前面我提到了微服务的兴起以及提高 GoLang 或 Node 技能的必要性。 事实上,即使在 PHP MVC 文章中,如果不提及向微服务导向架构 (MOA) 的明显转变,那也是愚蠢的;而且它的发展势头之快令人难以置信。

虽然这两个概念并非相互排斥,但没有理由试图在这两者之间寻找相似之处,因为它们确实代表着不同的,尽管是相交的哲学。

例如,将您的 MVC 应用程序放在一个容器中,将 MySQL 放在另一个容器中,然后将它们链接在一起,并不一定代表一个合适的 MOA。 这当然是一个更好的方法,事实上,比试图安装 MAMP、XAMPP 或您需要获得本地机器来服务应用程序的其他任何杂乱的东西要好得多。

此外,它还可以解决一些问题,例如在不同平台(开发人员)上轻松运行本地环境,以及在某些情况下部署策略,但是您的应用程序层/容器中仍然存在 MVC 单体应用。

单体应用的破坏

这种“破坏”正是微服务所要实现的。 虽然 MVC 通过提供一种可靠的方法来分离关注点来解决您的代码结构和组织问题,但容器/服务/MOA 将此概念进一步扩展。

您不再只是将视图与模型分开,而是现在将应用程序的每个“块”或逻辑单元分离到一个独立的服务中,该服务旨在正确处理其自身的职责。

如果您的 MVC 应用程序具有“搜索”控制器、操作和相关的模型方法,那么我们已经有了单体应用程序的示例。

相反,使用 MOA 方法,我们将为每个处理单元提供一个服务。例如:

  • 路由服务
  • 请求服务
  • 查询服务
  • 数据源服务
  • 响应服务

等等,但是所有这些“服务”不都是 MVC 堆栈的一部分吗?是的,就是这样。它们是我们单体应用的构建块。

使用 MOA,每个服务都在其自己的环境中运行,作为开发人员,更重要的是作为架构师,我们可以自由地设计解决特定需求的最佳方法。

例如,如果要在 Laravel 环境中编写图像处理服务,我可能会使用 PHP-GD2 扩展之类的工具,这可能不是处理图像最有效的方法。处理我的图像处理需求的 C 服务可能会快得多,并且在规模上肯定更强大。为了进一步阐述,我们现在可以获取图像处理服务的输出,并将其发送到 DataStore 服务、CloudStorage 服务和 Queue Email 服务。

使用一堆 cron 作业以及可能的一些单独的 MVC 应用程序和自定义脚本来解决同样的挑战,这就是我们过去(即 2 年前)的做法。是时候向前发展了。

可扩展性

这就是问题开始(或结束,取决于您的前进方向)的地方。一方面,很难扩展单体应用,如果您在同一个 MVC 堆栈中构建越来越多的逻辑,您可能会遇到一个结构良好的应用程序,但其复杂性却非常可怕。

另一方面,如果您构建了数千种不同语言的微服务,您如何管理那堆烂摊子?

已经报道了不止一个灾难。

有各种容器编排工具(如 Kubernetes、Swarm、Mesos),容器部署服务(即 GKE 和 AWS ECS),但是很少有企业掌握了 Docker 架构。使用 Docker 或其他容器技术(即 GKE)构建基础设施确实有一些成功案例。这些案例大多来自能够承担架构师、DevOps、DBA 和工程师资源的企业。尽管如此,就目前而言,关于如何部署一个精心编排且优雅的 MOA 的争论不计其数。在这种情况下,一种尺寸绝对不适合所有情况,并且有许多方法可以解决您的挑战。

无论哪种方式,您都不能独自解决这个问题(DevOps FTW!),而且只有在达到相对较大的规模后,这个问题才真正需要解决。也许现在不是过度设计的最佳时机。

对于今天(以及那些处理复杂程度或流量需求较低的应用程序的人)来说,一个快乐的中间方法是将许多典型的服务卸载到第三方提供商。现在几乎所有东西都可以作为服务提供。后台作业、图像处理、身份验证、数据分析、日志记录、电子邮件发送、队列系统不需要在同一个 MVC 堆栈中构建,而架构师应该考虑什么可以卸载到 SaaS 系统以获得低月费(即 Algolia 搜索)或可能在某些云空间中运行的自定义构建的 docker 服务,它处理烦人的图像处理。

我想这里的重点是,您不应该一头扎进重新架构项目中,不要丢弃您今天拥有的所有东西,并在任何可以想象的地方释放 docker swarms。可以通过解耦可能的部分、了解系统中的瓶颈并将关注点分离的概念应用于这些问题区域来逐步推出改进的基础。

结论

2017 年将为我们带来更多关于基于容器的 MOA 的对话和生产部署。我对 Docker、使用 GoLang 或 Node 的观点和胡言乱语并不意味着 PHP 正在“消亡”或其他任何类似的事情……我觉得作为开发人员,我们需要保持领先地位,所以如果微服务就是它所在的地方,那么为什么不学习 GoLang 呢?它非常适合(由于占用空间小、速度快和并行处理)开发小型容器化应用程序。Node 和 GoLang 很有趣,因为它们允许您构建小型服务,这些服务都是大型部落的一部分,将它们链接在一起,如果您愿意,可以将它们作为 Docker 容器的史诗般的 swarms 发布。 然而,所有这些令人敬畏的尖端解决方案和语言并不意味着 PHP 因此不再相关或“已死”。我们肯定会在一段时间内构建 MVC 堆栈和 API 端点。

尚未通过 MOA 解决的一个问题是,虽然容器帮助我们在后端消除了单体应用,但我们仍然面临着前端层、UI 或视图中的许多架构问题。 我们可以构建一个非常强大的后端应用程序,但最终它将以 JSON 响应,该 JSON 必须以某种方式在客户端应用程序中呈现。最终响应对象来自简单的 PHP(例如,Lumen 驱动的端点(URL))还是由消息接口解耦的一系列决策和处理单元,这是否重要?这确实非常取决于您的需求和应用程序的要求。

今年,学习 Laravel,关注 Docker、GoLang,并绝对关注部署管道。从本地到生产的转换应该比一段时间以来更加流畅,尤其是在构建 MVC 应用程序时。

关于 PHP MVC 框架的常见问题

什么是 PHP 中的 MVC 框架?

PHP 中的模型-视图-控制器 (MVC) 框架是一种设计模式,它将应用程序分成三个相互关联的组件。模型组件对应于用户使用与所有数据相关的逻辑。视图组件用于应用程序的所有 UI 逻辑。另一方面,控制器充当模型和视图组件之间的接口,以处理所有业务逻辑和传入请求。

为什么我应该使用 MVC 框架进行 PHP 开发?

使用 MVC 框架进行 PHP 开发具有多种优势。它提供了清晰的分离关注点,这使得代码更易于维护和理解。它还促进了代码的可重用性和可扩展性,允许开发人员创建健壮且大规模的应用程序。此外,MVC 框架通常带有内置的工具和库,以促进数据库抽象、表单验证、会话和 Cookie 处理等任务。

2017 年最顶尖的 PHP MVC 框架是什么?

在 2017 年,一些顶尖的 PHP MVC 框架包括 Laravel、Symfony、CodeIgniter、Yii2 和 CakePHP。Laravel 由于其优雅的语法、强大的功能和充满活力的开发者社区而尤其受欢迎。Symfony 也因其高度的灵活性和模块化架构而被广泛使用。

如何为我的项目选择合适的 PHP MVC 框架?

选择合适的 PHP MVC 框架取决于几个因素,包括项目的规模和复杂性、团队的专业知识、框架的社区和支持、其性能和可扩展性以及涉及的学习曲线。建议在做出决定之前,根据这些因素研究和比较不同的框架。

MVC 模式如何在 PHP 框架中工作?

在 PHP MVC 框架中,当用户发送请求时,它首先转到控制器,控制器识别要处理数据的适当模型。然后,模型与数据库交互,处理数据并将其发送回控制器。然后,控制器加载相应的视图,该视图以用户友好的格式向用户呈现数据。

什么是 Laravel,为什么它如此受欢迎?

Laravel 是一个 PHP MVC 框架,以其优雅的语法和丰富的功能而闻名。它提供了用于路由、身份验证、会话、缓存等任务的各种工具。Laravel 还拥有一个充满活力的社区和大量的文档,使其成为开发人员的热门选择。

PHP MVC 框架的学习曲线如何?

PHP MVC 框架的学习曲线可能会有所不同。Laravel 和 CodeIgniter 等一些框架以其简单性而闻名,并且相对容易学习。Symfony 和 Yii2 等其他框架可能需要更多时间才能掌握,因为它们的功能和概念比较复杂。

我可以在没有 MVC 框架的情况下使用 PHP 吗?

是的,您可以在没有 MVC 框架的情况下使用 PHP。但是,使用框架可以使您的开发过程更高效,并且您的代码更易于维护,尤其是在大型应用程序中。

什么是 PHP MVC 框架中的数据库抽象?

PHP MVC 框架中的数据库抽象是指隐藏数据库操作细节以避免影响应用程序其余部分的做法。这允许开发人员使用一致的 API 与数据库交互,而不管底层数据库系统如何。

如何开始使用 PHP MVC 框架?

要开始使用 PHP MVC 框架,您应该首先了解 PHP 和面向对象的编程基础知识。然后,您可以选择一个适合您需求的框架,并通过其官方文档、在线教程和社区论坛开始学习它。

以上是2017年PHP MVC框架的状态的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

PHP 8.1中的枚举(枚举)是什么? PHP 8.1中的枚举(枚举)是什么? Apr 03, 2025 am 12:05 AM

PHP8.1中的枚举功能通过定义命名常量增强了代码的清晰度和类型安全性。1)枚举可以是整数、字符串或对象,提高了代码可读性和类型安全性。2)枚举基于类,支持面向对象特性,如遍历和反射。3)枚举可用于比较和赋值,确保类型安全。4)枚举支持添加方法,实现复杂逻辑。5)严格类型检查和错误处理可避免常见错误。6)枚举减少魔法值,提升可维护性,但需注意性能优化。

会话如何劫持工作,如何在PHP中减轻它? 会话如何劫持工作,如何在PHP中减轻它? Apr 06, 2025 am 12:02 AM

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

描述扎实的原则及其如何应用于PHP的开发。 描述扎实的原则及其如何应用于PHP的开发。 Apr 03, 2025 am 12:04 AM

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

解释PHP中的晚期静态绑定(静态::)。 解释PHP中的晚期静态绑定(静态::)。 Apr 03, 2025 am 12:04 AM

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

什么是REST API设计原理? 什么是REST API设计原理? Apr 04, 2025 am 12:01 AM

RESTAPI设计原则包括资源定义、URI设计、HTTP方法使用、状态码使用、版本控制和HATEOAS。1.资源应使用名词表示并保持层次结构。2.HTTP方法应符合其语义,如GET用于获取资源。3.状态码应正确使用,如404表示资源不存在。4.版本控制可通过URI或头部实现。5.HATEOAS通过响应中的链接引导客户端操作。

您如何在PHP中有效处理异常(尝试,捕捉,最后,投掷)? 您如何在PHP中有效处理异常(尝试,捕捉,最后,投掷)? Apr 05, 2025 am 12:03 AM

在PHP中,异常处理通过try,catch,finally,和throw关键字实现。1)try块包围可能抛出异常的代码;2)catch块处理异常;3)finally块确保代码始终执行;4)throw用于手动抛出异常。这些机制帮助提升代码的健壮性和可维护性。

PHP中的匿名类是什么?您何时可以使用它们? PHP中的匿名类是什么?您何时可以使用它们? Apr 04, 2025 am 12:02 AM

匿名类在PHP中的主要作用是创建一次性使用的对象。1.匿名类允许在代码中直接定义没有名字的类,适用于临时需求。2.它们可以继承类或实现接口,增加灵活性。3.使用时需注意性能和代码可读性,避免重复定义相同的匿名类。

See all articles