Laravel - 为 WEB 艺术家创造的 PHP 框架。

PHP THAT DOESN'T HURT. CODE HAPPY & ENJOY THE FRESH AIR.

Laravel logo

Laravel5里的按需地加载服务提供者(Service Providers)

laravel5中与环境相关的配置已经变得更加扁平化,很多以往写在不同配置文件中的变量(如L4+目录app/config下的文件)现在都统一移到了.env文件里了。

但是还有没有移到.env的配置,那就是与环境相关的加载服务提供者。

在一个项目里,我们想在服务提供者中注册错误处理器,同时又想注册另一个与环境相关的错误处理器。例如我们有处理器:ProductionErrorHandlerVerboseErrorHandler,两个用于不同开发环境下的处理器。

##正常地加载服务提供者##

如果你对在/config/app.php定义普通的(与环境不相关的)服务提供者不熟悉。可以看看这个下面的例子。 提供者providers的数组大概是这样:

    'providers' => [

        /*
         * Laravel Framework Service Providers...
         */
        'Illuminate\Foundation\Providers\ArtisanServiceProvider',
        'Illuminate\Auth\AuthServiceProvider',
        'Illuminate\Bus\BusServiceProvider',
        ...
    ]

如果你的服务提供者需要在每个环境下都要加载,只要把它放在这个数组下面就可以了。

##按需地加载服务提供者##

然而,如果你希望根据不同环境加载,你需要看看/app/Providers/AppServiceProvider.php。这个文件一般用来加载或注册一些相对独立的服务提供者(例如L5开箱子带Auth中的'Illuminate\Contracts\Auth\Registrar'实现),所以你可以按需地注册你的服务提供者。

这是最初我们看到的样子:

    <?php namespace app\Providers;

    use Illuminate\Support\ServiceProvider;

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

        /**
         * Register any application services.
         *
         * This service provider is a great spot to register your various container
         * bindings with the application. As you can see, we are registering our
         * "Registrar" implementation here. You can add your own bindings too!
         *
         * @return void
         */
        public function register()
        {
            $this->app->bind(
                'Illuminate\Contracts\Auth\Registrar',
                'App\Services\Registrar'
            );
        }}

写上相应选择环境的内容:

    // AppServiceProvider.php

    public function register()
    {
        $this->app->bind(
            'Illuminate\Contracts\Auth\Registrar',
            'App\Services\Registrar'
        );

        if ($this->app->environment('production')) {
            $this->app->register('App\Providers\ProductionErrorHandlerServiceProvider');
        } else {
            $this->app->register('App\Providers\VerboseErrorHandlerServiceProvider');
        }
    }

$this->app->register(将像在config/app.php中那样注册服务提供者,所以它的register()boot()都会在恰当的时间被调用

你也可以使用switch代替if,或者你也可以使用其他环境变量实现按需加载,或者更多其他方法——但上述方式应该是按需地加载服务提供者最好的方法了。希望这能帮到你!


原文地址——https://mattstauffer.co/blog/conditionally-loading-service-providers-in-laravel-5

关于作者 雨师
广州
由于学艺不精,内容可能有误。如有错误欢迎联系邮箱312841925@qq.com指出。谢谢!