本书未发布

服务提供者

未匹配的标注

扩展包的一个重要部分是它的服务提供者。 在创建我们自己的服务之前,我将首先在本节中解释什么是服务提供者。 如果你熟悉服务提供者,请继续阅读下一部分。

正如你可能知道的,Laravel 提供了一系列的服务提供者,即 AppServiceProviderAuthServiceProviderBroadcastServiceProviderEventServiceProvider 和 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"
          ],
      }
  }
}

现在,只要有人包含了我们的扩展包,服务提供者就会被加载,我们注册的所有东西都会在应用程序中可用。 现在让我们看看我们可能需要在这个服务提供者中注册什么。

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/laravel-package...

译文地址:https://learnku.com/docs/laravel-package...

上一篇 下一篇
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~