laravel核心服务
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了laravel核心服务相关的知识,希望对你有一定的参考价值。
服务容器
1.服务容器
laravel服务容器是一个用于管理类依赖以及实现依赖注入的强有力的工具。依赖注入这个名词表面看起来花哨,实质是指:通过构造函数,或者某些情况下通过[setter]方法将类依赖【注入】到类中。
如装药的药盒也是容器的一种。
2.服务绑定
想要把服务放到容器中去,需要使用服务绑定。服务绑定主要有以下几种方式:
1.简单绑定 - bind方法
2.绑定一个单例 -singleton方法
3.绑定一个实例 -instance方法
4.绑定接口到实现 -绑定的标识是一个契约
语法 $this->app->绑定方法(标识,绑定对象)
类似于把药放药箱里的过程。
3.服务解析
服务放到容器中后,需要在需要的时候使用。想要使用服务可以先获取服务的对象,而获取服务的对象的过程称为解析。服务对象的解析主要有以下几种方式:
- make方法:
make方法从容器中解析出类实例。make方法接收你想要解析的类或接口的名字。 - 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主要有以下几个步骤:
- 创建服务类
- 创建并编写代理类
实现上述步骤之后就可以通过静态方法调用。当然我们还可以结合于服务提供者来实现。
四.Constracts
1.Contracts
laravel的契约是一组接口,他们由框架提供并定义了核心服务。每一个契约都有框架提供的相应的实现。所有的laravel契约都在他们各自的github仓库。这为所有可用的契约以及扩展包开发者们可能用到的单个、解耦的包提供了一个快速参考入口。
2.契约与门面
laravel的Facades和辅助函数提供了一种简单方式来使用laravel服务而无需用到类型提示,也可在服务容器外部解析契约。多数情况下,每个Facade都有一个等效的契约。
和Facades(不需要在你类中的构造函数去引用依赖)不同的是,契约允许你给自己的类定义明确的依赖。一些开发者更喜欢依赖被明确定义出来,所以更倾向于使用契约,而其他开发者则享受于 Facades带来的方便。
3.契约的优点
1.低耦合:契约扩展包不包含任何实现和依赖,你可以轻松的为给定的契约编写替代实现的代码,从而可以在不修改任何缓存代码的情况下替换缓存的实现。
2.简明性:当laravel的所有服务都在简单的接口中简洁的定义时,很容易就可以确定给定服务提供的功能。
4.自定义契约
契约的本质是一组接口,而接口无法实例化自身,所以还需要有对应的实现类。接下来我们就创建一些自己的契约:
1.创建契约
2.创建实现类并实现契约
同样,如果我们想要使代码变得更加灵活,我们可以使用服务提供者来实现契约与实现类的绑定,这样我们可以通过改变契约的绑定来切换具体实现。
以上是关于laravel核心服务的主要内容,如果未能解决你的问题,请参考以下文章