laravel核心服务

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了laravel核心服务相关的知识,希望对你有一定的参考价值。


服务容器

1.服务容器

laravel服务容器是一个用于管理类依赖以及实现依赖注入的强有力的工具。依赖注入这个名词表面看起来花哨,实质是指:通过构造函数,或者某些情况下通过[setter]方法将类依赖【注入】到类中。
如装药的药盒也是容器的一种。

2.服务绑定

想要把服务放到容器中去,需要使用服务绑定。服务绑定主要有以下几种方式:
1.简单绑定 - bind方法
2.绑定一个单例 -singleton方法
3.绑定一个实例 -instance方法
4.绑定接口到实现 -绑定的标识是一个契约

语法 $this->app->绑定方法(标识,绑定对象)
类似于把药放药箱里的过程。

3.服务解析

服务放到容器中后,需要在需要的时候使用。想要使用服务可以先获取服务的对象,而获取服务的对象的过程称为解析。服务对象的解析主要有以下几种方式:

  1. make方法:
    make方法从容器中解析出类实例。make方法接收你想要解析的类或接口的名字。
  2. resolve辅助函数:
    你的代码处于无法访问$app变量的位置,可用全局辅助函数resolve来解析

语法:$this->app->解析方法(标示)
类似于把药从药箱里取出的过程。

二.服务提供者

1.服务提供者

服务提供者是所有laravel应用程序的引导中心。你的应用程序,以及通过服务器引导的laravel核心服务都是通过服务提供者引导。
引导我们一般可以理解为注册,比如注册服务容器绑定,事件监听,中间件,甚至路由。服务提供者是配置应用程序的中心。

服务提供者创建:
laravel框架虽然给我们提供了比较多的服务提供者,但有时候我们也需要自己的服务提供者,例如编写自己的组件时。这时,我们可以借助make:provider命令生成服务提供者:

php artisan make:provider XXServiceProvider

服务提供者的注册与启动方法:

所有的服务提供者都会集成illuminate\\Support\\ServicePorvider类。大多数服务提供者都包含一个register和一个boot方法。在register方法中,你只需要将服务绑定到服务容器。而不要尝试在register方法中注册任何监听器、路由、或者其他功能。

register方法:
在register方法中,你只需要将服务绑定到服务容器中。而不要尝试在register方法中注册任何监听器,路由,或者其他任何功能。否则,你可能会意外的使用到尚未加载的服务提供者提供的服务。
如果你的服务提供器注册了很多简单的绑定,你可能想用bindings和singletons属性替代手动注册每个容器绑定。当服务提供器被框架加载时,将自动检查这些属性并注册对应的绑定。

注册服务提供者:
所有服务提供者都是通过配置文件 config/app.php进行注册。该文件包含了一个列出所有服务提供者名字的providers数组,默认情况下,其中列出了所有核心服务提供者,这些服务提供者启动laravel核心组件。

要注册服务提供者,只需将其添加到数组:

providers=>[
App\\Providers\\ComposerServiceProvider::class,
]

三.Facades

1.Facades

Facades为应用的服务容器 提供了一个【静态】接口。laravel自带了很多Facades,可以访问绝大部分功能。Laravel Facades实际是服务容器中底层类的【静态代理】,相对于传统静态方法,使用时能提供更加灵活、更加易于测试、更加优雅的语法。例如路由的使用:

Route::路由方法()

如果不使用静态方式则需要创建 illuminate\\Routing\\Router类的实例类调用对应的路由方法

$router = app()->make(router)
$router->get(instance,function()
return instance的路由;
)

2.工作原理:

在laravel应用中,Facade就是一个可以从容器访问对象的类。其中核心的部件就是Facade类。不管是laravel自带的Facades,还是自定义的Facades,都继承自illuminate\\Support\\Facades\\Facade类。
Facade基类使用了__callStatic()魔术方法,直到对象从容器中被解析出来后,才会进行调用。在下面的例子中,调用了laravel的缓存系统。通过浏览这段代码,可以假定在Cache类中调用了静态方法get.

3.自定义Facades

当我们自己提供了一个服务类,想要让该类也能实现静态调用,我们可以定义属于我们自己的Facades.自定义Facades主要有以下几个步骤:

  1. 创建服务类
  2. 创建并编写代理类
    实现上述步骤之后就可以通过静态方法调用。当然我们还可以结合于服务提供者来实现。

四.Constracts

1.Contracts

laravel的契约是一组接口,他们由框架提供并定义了核心服务。每一个契约都有框架提供的相应的实现。所有的laravel契约都在他们各自的github仓库。这为所有可用的契约以及扩展包开发者们可能用到的单个、解耦的包提供了一个快速参考入口。

laravel核心服务_ide

2.契约与门面

laravel的Facades和辅助函数提供了一种简单方式来使用laravel服务而无需用到类型提示,也可在服务容器外部解析契约。多数情况下,每个Facade都有一个等效的契约。

和Facades(不需要在你类中的构造函数去引用依赖)不同的是,契约允许你给自己的类定义明确的依赖。一些开发者更喜欢依赖被明确定义出来,所以更倾向于使用契约,而其他开发者则享受于 Facades带来的方便。

3.契约的优点

1.低耦合:契约扩展包不包含任何实现和依赖,你可以轻松的为给定的契约编写替代实现的代码,从而可以在不修改任何缓存代码的情况下替换缓存的实现。
2.简明性:当laravel的所有服务都在简单的接口中简洁的定义时,很容易就可以确定给定服务提供的功能。

4.自定义契约

契约的本质是一组接口,而接口无法实例化自身,所以还需要有对应的实现类。接下来我们就创建一些自己的契约:
1.创建契约
2.创建实现类并实现契约
同样,如果我们想要使代码变得更加灵活,我们可以使用服务提供者来实现契约与实现类的绑定,这样我们可以通过改变契约的绑定来切换具体实现。


以上是关于laravel核心服务的主要内容,如果未能解决你的问题,请参考以下文章

Laravel核心解读--HTTP内核

医药箱APP静态小项目

毕业设计之 - 基于STM32的智能药箱系统设计与实现

laravel核心服务

Laravel创建 Service Provider 测试实例

Laravel 核心--Facades 门面