如何从供应商包本身引导laravel 5服务提供商?

时间:2016-01-07 12:55:32

标签: php laravel laravel-5 service-provider

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

我是作曲家包开发的新手,尤其是使用服务提供商将包挂钩到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包本身注册多个服务提供者?

3 个答案:

答案 0 :(得分:8)

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

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

结果我可以使用register()外观上的App方法通过同一个提供商注册任何相关服务提供商,并在我的主TenantServiceProvider的注册方法中调用它,如下所示:

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

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

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

答案 1 :(得分:1)

你可以创建一个包composer.json文件,并在那里为包本身添加依赖关系,这样当你做作曲家需要作者/包时,它会查看该包的依赖关系,并在下面自动要求它们是一个例子。我经常拉的包的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工匠供应商:发布所以不要忘记

答案 2 :(得分:0)

更新

从Laravel 5.5开始,您现在可以通过在软件包的composer.json中添加以下代码块,向依赖它的应用程序注册软件包的服务提供商:

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

请参阅文档:https://laravel.com/docs/5.5/packages#package-discovery