[ Laravel 从学徒到工匠系列 ] 设计原则篇:依赖反转原则

简介 在整个「SOLID」原则概述的旅途中,我们到达最后一站了!最后一个原则是依赖反转原则,它规定高层次的代码不应该依赖低层级的代码。换句话说,高层次的代码应该依赖抽象接口,抽象接口就像是「中间人」一样,负责连接着高层次和低层次代码。这个原则的另一层意思是,抽象接口不应该依赖具体实现,但具体实现应该依赖抽象接口。如果这些理论听起来让你极端困惑,别担心,接下来我们会将围绕这两个方面将这个原...

[ Laravel 从学徒到工匠系列 ] 设计原则篇:接口隔离原则

简介 接口隔离原则规定,不应该强制接口的实现依赖于它不使用的方法。你是否曾被迫去实现一些你用不到的接口方法?如果答案是肯定的,那么你可能会在实现里创建一个空方法。这就是一个使用了违背接口隔离原则的接口的例子。 在实际操作中,这个原则要求接口必须粒度很细,且专注于一个领域。听起来很耳熟?记住,所有五个「SOLID」原则都是相关的,也就是说违背了其中一个原则,通常意味着也违背了其他的原则。当...

[ Laravel 从学徒到工匠系列 ] 设计原则篇:里氏替换原则

简介 别担心,里氏替换原则名字起的高大上,但是其实很简单。该原则可以描述为:一个抽象的任意实现都可以在声明该抽象的地方替换它。读起来有点绕口,通俗点说就是个:如果一个类使用了某个接口的实现,那么一定可以通过该接口的其它实现来替换它,不用做出任何修改。 里氏替换原则规定对象可以被其子类的实例所替换,并且不会影响到程序的正确性。 实战 为了说明该原则,我们继续使用前面编写的 OrderP...

[ Laravel 从学徒到工匠系列 ] 设计原则篇:开放封闭原则

简介 在一个应用的生命周期里,大部分时间都花在了向现有代码库增加功能,而非一直从零开始写新功能。你可能已经意识到了,这会是一个繁琐且令人痛苦的过程。无论何时你修改代码,都有可能引入新的bug,或者破坏原有的旧功能。理想情况下,我们应该可以像写全新的代码一样来快速修改现有的代码。如果采用开放封闭原则来正确设计我们的应用程序,那么这是可以做到的! 开放封闭原则,又称开闭原则,规定代码对扩展...

[ Laravel 从学徒到工匠系列 ] 设计原则篇:单一职责原则

简介 罗伯特·C·马丁在 21 世纪早期引入了名为「SOLID」的设计原则,指代了面向对象编程和面向对象设计的五个基本原则: 单一职责原则(Single Responsibility Principle) 开放封闭原则(Open Closed Principle) 里氏替换原则(Liskov Substitution Principle) 接口隔离原则(Interface Segreg...

[ Laravel 从学徒到工匠系列 ] 框架扩展篇

简介 为了方便你自定义框架的核心组件功能,甚至是完全替换它们,Laravel 提供了大量可以对应用进行扩展的地方。例如,哈希服务实现了 Illuminate\Contracts\Hashing\Hasher 契约,你可以按照自己应用的需求来重新实现它。你还可以继承 Request 对象类,添加自己用的顺手的方法。你甚至可以添加全新的用户认证、缓存和会话驱动! Laravel 组件功能通常...

[ Laravel 从学徒到工匠系列 ] 应用架构篇

简介 我们已经学习了通过 Laravel 构建架构良好的应用的各个方面,接下来,让我们再深入探讨一些细节。在本章,我们将讨论如何解耦各种处理器:队列处理器、事件处理器,甚至其他「类似事件」的结构,比如路由过滤器。 大部分的「处理器」可以被当作传输层组件。也就是说,它们通过队列处理器、被触发的事件、或者外部发来的请求等接收调用。这样一来,我们可以将这些处理器理解为控制器,同样需要避免在它...

[ Laravel 从学徒到工匠系列 ] 目录结构篇

简介 这个类要放到哪儿?这可能是基于框架构建应用时非常常见的问题。很多开发者都会有这个疑问,因为他们被灌输了「模型」就是「数据库」这种概念。因此,在控制器里面处理 HTTP 请求,在模型类里面操作数据库增删改查,在视图里编写要显示的HTML,成了开发者们约定俗成的规定。但是,发送电子邮件的类要放到哪儿?验证数据的类呢?调用外部 API 的类呢?在这一章中,我们将介绍 Laravel 框架...

[ Laravel 从学徒到工匠系列 ] 服务提供者篇

作为引导者 Laravel 服务提供者主要用来进行注册服务容器绑定(即注册接口及其实现类的绑定)。事实上,Laravel 有好几十个服务提供者,用于管理框架核心组件的容器绑定。几乎框架里每一个组件的容器绑定都是靠服务提供者来完成的。你可以在 config/app.php 这个配置文件里查看项目目前有哪些服务提供者(从 Laravel 5.5 开始,Laravel 提供了包自动发现功能,所...

[ Laravel 从学徒到工匠系列 ] 接口即契约篇

强类型与鸭子类型 在之前的章节里,我们讨论了依赖注入的基础知识:什么是依赖注入;如何实现依赖注入;依赖注入有什么好处。之前的例子中也模拟了将接口注入到类里面的过程。在我们继续学习后续内容之前,有必要深入讨论一下接口,而这正是很多 PHP 开发者所不熟悉的。 在我成为 PHP 程序员之前,我是写 .NET 的。你觉得我是喜欢原生代码还是什么?在 .NET 里到处都是接口,而且很多接口都定义...