php中文网最新课程
每日17点准时技术干货分享
如果你使用过 Laravel 框架的话,那么,你不可能没听说过服务容器和服务提供者。事实上,它们是 Lavavel 框架核心,它们完成 Larvel 应用中服务启动的艰巨任务。
在这篇文章中,我们将给大家介绍laravel的服务提供者是什么?
在学习服务提供者之前,先简单介绍一下服务容器,服务容器会在服务提供者中被经常使用。
简而言之,Laravel 服务容器 是一个用于存储绑定组件的盒子,它还会为应用提供所需的服务。
Laravel 文档中描述如下:
Laravel 服务容器是用于管理类的依赖和执行依赖注入的工具 - Laravel 文档
这样,当我们需要注入一个内置的组件或服务时,可以在构造函数或方法中使用类型提示功能注入,然后在使用时从服务容器中自动解析出所需实例及其依赖!是不是很酷?这个功能可以让我们从手动管理组件中解脱出来,从而降低系统耦合度。
让我们看一个简单实例来加深理解。
<?php
Class SomeClass
{
public
function
__construct(FooBar
$foobarObject
)
{
// use $foobarObject object
}
}
如你所见,SomeClass 需要使用 FooBar 实例。换句话说它需要依赖其它组件。Laravel 实现自动注入需要从服务容器中查找并执行注入适当的依赖。
如果你希望了解 Laravel 是如何知道需要将哪个组件或服务绑定到服务容器中的,答案是通过服务提供者实现的。服务提供者完成将组件绑定到服务容器的工作。在服务提供者内部,这个工作被称之为服务容器绑定,绑定处理由服务提供者完成。
服务提供者实现了服务绑定,绑定处理则由 register 方法完成。
同时,这又会引入一个新的问题:Laravel
是如何知道有哪些服务提供者的呢?这个我们貌似还没有讨论到吧?我到时看到,之前有说 Laravel
会自动的去查找到服务!朋友,你的问题太多了:Laravel 只是一个框架,它不是一个超级英雄,不是么?我们当然需要去明确的告知 Laravel
框架我们有哪些服务提供者。
让我们来瞧瞧 config/app.php
配置文件。你会找到一个用于 Laravel 应用启动过程中被载入的服务提供者配置列表。
'providers'
=> [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::
class
,
Illuminate\Broadcasting\BroadcastServiceProvider::
class
,
Illuminate\Bus\BusServiceProvider::
class
,
Illuminate\Cache\CacheServiceProvider::
class
,
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::
class
,
Illuminate\Cookie\CookieServiceProvider::
class
,
Illuminate\Database\DatabaseServiceProvider::
class
,
Illuminate\Encryption\EncryptionServiceProvider::
class
,
Illuminate\Filesystem\FilesystemServiceProvider::
class
,
Illuminate\Foundation\Providers\FoundationServiceProvider::
class
,
Illuminate\Hashing\HashServiceProvider::
class
,
Illuminate\Mail\MailServiceProvider::
class
,
Illuminate\Notifications\NotificationServiceProvider::
class
,
Illuminate\Pagination\PaginationServiceProvider::
class
,
Illuminate\Pipeline\PipelineServiceProvider::
class
,
Illuminate\Queue\QueueServiceProvider::
class
,
Illuminate\Redis\RedisServiceProvider::
class
,
Illuminate\Auth\Passwords\PasswordResetServiceProvider::
class
,
Illuminate\Session\SessionServiceProvider::
class
,
Illuminate\Translation\TranslationServiceProvider::
class
,
Illuminate\Validation\ValidationServiceProvider::
class
,
Illuminate\View\ViewServiceProvider::
class
,
/*
* Package Service Providers...
*/
Laravel\Tinker\TinkerServiceProvider::
class
,
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::
class
,
App\Providers\AuthServiceProvider::
class
,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::
class
,
App\Providers\RouteServiceProvider::
class
,
],
以上就是有关服务容器的基本概念。
什么是服务提供者
如果说服务容器是提供绑定和依赖注入的的工具,那么 服务提供者 则是实现绑定的工具。
让我们先来看一个内容提供的服务提供者服务来理解它的运行原理。打开 vender/laravel/framework/src/Illuminate/Cache/CacheServiceProvider.php
文件。
public
function
register()
{
$this
->app->singleton(
'cache'
,
function
(
$app
) {
return
new
CacheManager(
$app
);
});
$this
->app->singleton(
'cache.store'
,
function
(
$app
) {
return
$app
[
'cache'
]->driver();
});
$this
->app->singleton(
'memcached.connector'
,
function
() {
return
new
MemcachedConnector;
});
}
这里我们需要将重点集中在 register 方法中,这个方法用于绑定服务到服务容器。如你所见,这里一共执行了三个服务的绑定处理:cache
、cache.store
和 memcached.connector
。
然后,当我们需要在 Laravel 中使用 cache 服务是,服务容器会解析出 CacheManager 实例并返回。也就是说我们仅仅是提供了一个可以从$this->app
访问的对应关系表。
通过服务提供者绑定服务是 Laravel 服务容器绑定服务的正确打开方式。同时通过服务提供者的 register 方法,还有利于理解 Laravel 服务容器是如何管理所有的服务的。我们之前提到过,通过从 config/app.php
配置文件中读取服务提供者配置列表,从将所有服务注册服务容器中。以上,就是服务提供者的介绍。
以上就是laravel的服务提供者是什么的详细内容,更多请关注php中文网其它相关文章!
-END-
声明:本文选自「 php中文网 」,搜索「 phpcnnew 」即可关注!
▼请点击下方:“阅读原文”,在线查看全部文章内容!
文章评论