如何从vendor包本身bootstraplaravel 5服务提供者?

How to bootstrap laravel 5 service providers from the vendor package itself?

我正在开发一个 Laravel 5 应用程序,现在该应用程序的代码应该在多个 laravel 5 应用程序中重复使用,这就是为什么我要创建一个 composer 包然后我想在任意数量的 laravel 5 应用程序中安装此包以具有相同的功能并在其基础上进行构建。

我是 composer 包开发的新手,尤其是使用服务提供商将包挂钩到 Laravel 5 中。到目前为止,我了解到如果我使用如下所示的服务提供商,我将能够使用 laravel 5 应用程序中的路由:

<?php

namespace Uppdragshuset\AO\Tenant;

use Illuminate\Support\ServiceProvider;

class TenantServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        include __DIR__.'/routes.php';
    }
}

现在要完成这项工作,我只需要通过 composer 将包安装到任何全新的 Laravel 5 安装中,然后我只需要更新 app.php 中的提供程序数组:

Uppdragshuset\AO\Tenant\TenantServiceProvider::class

这对我来说很有意义,也很有效。但是现在我正在开发的包也有自己的依赖包,其中许多依赖包也包含 laravel 5 服务提供商,所以我必须手动将它们全部包含在 laravel5 安装中才能制作他们工作。

但我猜一定有一种方法可以在我自己创建的包中注册这些依赖服务提供者,这样我只需要注册上面提到的一个提供者。问题是我不知道该怎么做,也无法在任何地方找到类似的参考资料。如何从 composer 包本身注册多个服务提供商?

您可以创建一个包 composer.json 文件并在其中添加包本身的依赖项,这样当您执行 composer require author/package 时,它会查看该包的依赖项并自动需要它们下面是我经常拉

的包的 composer.json 要求的示例
"require": {
    "php": ">=5.5.0",
    "illuminate/console": "~5.0",
    "illuminate/support": "~5.0",
    "illuminate/cache": "~5.0"

您可以添加以下启动方法来发布您的服务提供商

 public function boot()
{
    $this->publishes([
        __DIR__ . '/config/configifyouhaveone.php' => config_path('pathtotheconfig.php')
    ]);
    AliasLoader::getInstance()->alias(
        'serviceprovidername',
        'Namespace\Subfolder\PackageName\PackageFacade'
    );
}

之后你需要做 php artisan vendor:publish 所以不要忘记

所以我终于想通了如何从 composer 包本身注册依赖的服务提供者。

我的包中有主要 TenantServiceProvider,它应该挂接到主应用程序的路由中,还负责发布迁移、配置等。

事实证明,我可以使用 App 外观上的 register() 方法通过同一提供者注册任何依赖的服务提供者,并在我的主要 TenantServiceProvider 的注册方法中调用它,例如所以:

public function register()
{
    include __DIR__.'/routes.php';

    App::register(RepositoryServiceProvider::class);
    App::register(\Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class);
}

这样我只需要在 laravel 应用程序的 app.php 配置文件中的提供程序数组中注册 TenantServiceProvider。当它被调用并调用其上的 register 方法时,所有其他提供者将通过 App::register() 调用注册。希望这对某人有所帮助。

更新

由于 Laravel 5.5 您现在可以通过将以下块添加到您的包的 composer.json:

来向依赖它的应用程序注册您的包的服务提供者

...
"extra": {
    "laravel": {
        "providers": [
            "Acme\Package\ServiceProvider"
        ]
    }
},
...

查看文档:https://laravel.com/docs/5.5/packages#package-discovery