服务提供者
扩展包的一个重要部分是它的服务提供者。 在创建我们自己的服务之前,我将首先在本节中解释什么是服务提供者。 如果你熟悉服务提供者,请继续阅读下一部分。
正如你可能知道的,Laravel 提供了一系列的服务提供者,即 AppServiceProvider
, AuthServiceProvider
, BroadcastServiceProvider
, EventServiceProvider
和 RouteServiceProvider
。 这些提供者负责“引导”(或“注册”)应用程序特定的服务(作为服务容器绑定)、事件监听器、中间件和路由。
每个服务提供者都继承了 Illuminate\Support\ServiceProvider
并实现了一个 register()
和一个 boot()
方法。
register()
方法用于绑定服务容器中的内容。 在所有其他服务提供者注册之后(即调用了所有服务提供者的所有register()方法,包括第三方包) ,Laravel 将调用所有服务提供者的 boot() 方法。
例如,在 register()
方法中,你可以在服务容器中注册一个类绑定,从而从容器中解析一个类。 但是,有时需要引用另一个类,在这种情况下可以使用 boot()
。
下面是一个示例,说明服务提供者可能的的样子,以及你可能在register()
和 boot()
方法中实现的内容。
use App\Calculator;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
// Register a class in the service container
$this->app->bind('calculator', function ($app) {
return new Calculator();
});
}
public function boot()
{
// Register a macro, extending the Illuminate\Collection class
Collection::macro('rejectEmptyFields', function () {
return $this->reject(function ($entry) {
return $entry === null;
});
});
// Register an authorization policy
Gate::define('delete-post', function ($user, $post) {
return $user->is($post->author);
});
}
}
添加扩展包的服务提供者
对于我们的扩展包,我们将创建自己的服务提供者,其中包含有关扩展包必须提供的核心内容的特定信息。 这个包可能使用一个配置文件,也许是一些视图、路由、控制器、数据库迁移、模型工厂、自定义命令等。 服务提供者需要注册它们。 我们将在以后的章节中逐一讨论这些问题。
既然我们已经引入了 Orchestra Testbench,我们可以继承 Illuminate\Support\ServiceProvider
并在 src/
目录中创建我们自己的服务提供者,如下所示(用你自己的详细信息替换命名) :
// 'src/BlogPackageServiceProvider.php'
<?php
namespace JohnDoe\BlogPackage;
use Illuminate\Support\ServiceProvider;
class BlogServiceProvider extends ServiceProvider
{
public function register()
{
//
}
public function boot()
{
//
}
}
自动加载
为了使用 Laravel 的扩展包自动发现功能在 Laravel 项目中自动注册,我们将服务提供者添加到包的composer.json
中的 "extra" > "laravel" > "providers" 键:
{
...,
"autoload": { ... },
"extra": {
"laravel": {
"providers": [
"JohnDoe\\BlogPackage\\BlogPackageServiceProvider"
],
}
}
}
现在,只要有人包含了我们的扩展包,服务提供者就会被加载,我们注册的所有东西都会在应用程序中可用。 现在让我们看看我们可能需要在这个服务提供者中注册什么。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: