Laravel5里的按需地加载服务提供者(Service Providers)
laravel5中与环境相关的配置已经变得更加扁平化,很多以往写在不同配置文件中的变量(如L4+目录app/config
下的文件)现在都统一移到了.env
文件里了。
但是还有没有移到.env的配置,那就是与环境相关的加载服务提供者。
在一个项目里,我们想在服务提供者中注册错误处理器,同时又想注册另一个与环境相关的错误处理器。例如我们有处理器:ProductionErrorHandler
和VerboseErrorHandler
,两个用于不同开发环境下的处理器。
##正常地加载服务提供者##
如果你对在/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