如果您曾经遇到过Laravel框架,那么您极少听说过服务容器和服务提供商。 实际上,它们是Laravel框架的骨干,并且在您启动任何Laravel应用程序的实例时会承担所有繁重的工作。
在本文中,我们将大致了解服务容器的含义,然后,我们将详细讨论服务提供者。 在本文的过程中,我还将演示如何在Laravel中创建自定义服务提供程序。 创建服务提供者后,还需要在Laravel应用程序中注册它才能真正使用它,因此我们也将进行介绍。
您的服务提供商可以实现两种重要的方法,即引导和注册,在本文的最后一部分中,我们将彻底讨论这两种方法。
在我们深入讨论服务提供商之前,我将尝试介绍服务容器,因为它将在您的服务提供商实现中大量使用。
了解服务容器和服务提供商
什么是服务容器?
用最简单的话来说,我们可以说Laravel中的服务容器是一个容纳各种组件绑定的盒子,并且在整个应用程序中根据需要提供它们。
用Laravel官方文档的话来说:
Laravel服务容器是用于管理类依赖关系和执行依赖关系注入的强大工具。
因此,每当需要注入任何内置组件或服务时,都可以在构造函数或方法中键入hint,由于包含了所需的一切,它将自动从服务容器中注入! 那不是很酷吗? 它使您不必手动实例化组件,从而避免了代码之间的紧密耦合。
让我们看一个简单的例子来理解它。
Class SomeClass
{
public function __construct(FooBar $foobarObject)
{
// use $foobarObject object
}
}
如您所见, SomeClass
需要一个FooBar
实例来实例化自身。 因此,基本上,它具有需要注入的依赖项。 Laravel通过查看服务容器并注入适当的依赖项来自动执行此操作。
而且,如果您想知道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,
/*