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

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

作者:雨师 • 2015年03月22日

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值