第3章 解析框架核心设计模式

2023-12-14 21:32:45

3.1 探索 Facade 实现原理

什么是 Facade ?

Facade 即门面模式,又被称为代理模式,当应用程序需要与容器中的对象打交道时,就可通过门面(Facade ) 对象来获取容器内部中的具体对象。相当于是通过一个第三方类和容器中对象进行通讯。

门面类实现了应用程序与容器之间的解耦,要想实现门面类的特性,需要先实现一个抽象门面的基类,然后通过 getFacadeAccessor( ) 返回对应实现门面类的别名,而这别名就可直接用于在容器中去提取出对应的类对象,供应用程序使用。

在这里插入图片描述

3.2 理解中间件实现本质 Pipeline

什么是 Pipeline 模式 ?

管道模式用于将复杂的过程分解成多个独立的子任务。那这每个子任务是谁来完成呢?在框架中每个任务的执行是通过中间件来完成对请求的过滤执行操作。

怎么实现的?把中间件放到数组中,然后基于 array_reduce() 函数,把数组中的每个中间件,回调到闭包函数中进行执行,最后得到处理后的结果

相当于咱们喝的饮用水一样,开始有杂质的水会流入到过滤得管道,管道中存在过滤网、 晴纶绵 、 石英砂、 柱状活性炭 等东西。杂质的水只有通过它们后,才能得到纯净水。

在这里插入图片描述

3.3 分析契 Contracts 设计

什么是 Contracts 模式 ?

契约本质就是接口,用来定义相关类库的功能职责,从而约束类的功能职责和定义标准。

Laravel 中许多功能类都是通过 服务容器 解析出来的,包括控制器、事件监听器、中间件、任务队列,甚至路由闭包。因为在容器注入时,会采用关键字来绑定,接口与类的关系。而类又会实现接口,这样方法的类型约束为接口时,只要实现了这个接口的类,都是可以别注入到对象中。

所以,通过一个契约的实现,只需要在被解析类的构造函数中添加「类型提示」即可得到对象。因为路由解析完成后,程序会执行控制器,而在执行控制器的时候,也会通过容器的 make 方法先拿到容器中的对象,当然这里就会通过反射机制来实例化控制器啦。而控制器中调用方法里面约束要传入的对象,也会通过 ReflectionMethod 进行反射创建实例给到我们控制器需要的对象。最后可以直接调用方法来执行业务操作啦。

在这里插入图片描述

3.4 解密服务提供者

什么是服务提供者 ?

服务提供者,在 Laravel 里面,本质就是一个工厂类。用它来进行服务绑定。当我们需要绑定一个或多个服务的时候,就可以自定义一个服务提供者,然后把服务绑定的逻辑都放在该类中实现。然后框架在进程初始化引导时,就会调用相关服务注册者的 register 来完整注册。

在 Laravel 里面,要自定义一个服务提供者,只要继承 Illuminate\Support\ServiceProvider 这个类即可。

//laraveldemo\vendor\laravel\framework\src\Illuminate\Support\ServiceProvider.php
<?php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    protected $defer = true;

    public function boot()
    {
//
    }

    public function register()
    {
		$this->app->singleton('s1', function(){
    		return 'class_Service1';
		});
		$this->app->singleton('s2', function(){
    		return 'class_Service2';
		});
		$this->app->singleton('s3', function(){
    		return 'class_Service3';
		});
    }

    public  function provides()
    {
		return ['s1','s2','s3'];
    }
}

3.5 洞察组件化实现原理

1. 组件化的前身 ?

在没有组件化时,开发对应的业务功能都会写在一起,而且功能只能让自己的业务模块来使用,如果后面有相似的项目就没法做到快速移植,还需要重新开发一次。
在这里插入图片描述

2. 什么是组件化 ?

把一些通用的功能或业务以组件化的方式进行抽离,相当于插拔式的效果,需要使用组件时,直接插入到框架中来。后面不同的项目或业务需要使用到对应的功能或业务模块时,都可直接引入对应的组件,这样就可以直接复用到组件中的功能。

3. 怎么选择组件化 ?

最好是通用的功能或业务组件,比如发布功能,如果只想单独写一个发布就算了,那么只能适应于当前的业务,但如果根据组件化的方式进行封装,把发布和数据相关的存储操作给抽离出来,然后封装成组件化,后面就可以直接引用到组件的。

如果是业务组件,那么可以把用户、订单等模块给直接提取出来,来做到封装。

组件化的根本就是通用方法,有些需要条件的需求可通过配置私有化,直接进行解决。

4. 如何开发组件呢 ?

  1. 根据 composer 来进行组件化的开发,可直接把相关功能给封装到类库中。

  2. 自行组件类库封装,后面项目需要用到这个功能直接复制相关类库到项目的共用模块中

文章来源:https://blog.csdn.net/qq_52097760/article/details/132744083
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。