Laravel 5 中注册 local 环境的 Provider

教程 NauxLiu ⋅ 于 2年前 ⋅ 最后回复由 NauxLiu 2年前 ⋅ 4442 阅读

在L4中,想要仅在local环境中加载想要的provider,可以在app/config/local/app.php文件这样做:

<?php

return array(

    'debug' => true,

    'providers' => append_config(array( 
        'Clockwork\Support\Laravel\ClockworkServiceProvider',
        'Way\Generators\GeneratorsServiceProvider',
        'Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider',
    ))

);

在L5中,虽然源码中append_config方法还保留着,但是这种方式已经不奏效了。

因为Laravel5取消支持环境子文件夹了, 所有app/config/app.php中的其他配置项会被覆盖掉

看了L5的文档,官方也没有提供解决方法。

所以还是靠自己的办法来解决,我的办法是创建一个provider,在其中使用下面的代码专门来提供开发环境中的provider注册。
当然你也可以直接将代码贴在app/config/app.php文件中,虽然我认为这不是一个好的方式~

use App;

//....

if(App::environment('local'))
{
    App::register('Clockwork\Support\Laravel\ClockworkServiceProvider');
    App::register('Way\Generators\GeneratorsServiceProvider');
    App::register('Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider');
}
本帖已被设为精华帖!
回复数量: 9
  • baocaixiong
    2年前

    搜到一个答案和你的相同: L5 append_config problem

  • NauxLiu https://github.com/nauxliu
    2年前

    @baocaixiong 我就是搜到的这个:relaxed:

  • baocaixiong
    2年前

    @NauxLiu 看到你这里的说法是有bug的哟。 你说的是将下面的代码粘贴到app/config/app.php

    if($this->app->environment('local'))
    {
        App::register('Clockwork\Support\Laravel\ClockworkServiceProvider');
        //....
    }

    那么问题来了,app/config/app.php中哪里来的$this呢?

    我认为稍微正确的做法是这样的, 手动写一个EnvServiceProvider:+1:

    namespace App\Providers;
    
    use Illuminate\Support\ServiceProvider;
    
    class EnvServiceProvider extends ServiceProvider
    {
    
        /**
         * Register the service provider.
         *
         * @return void
         */
        public function register()
        {
            if ($this->app->environment('local')) {
                $this->app->register('Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider');
            }
        }
    }

    然后再将 App\Providers\EnvServiceProvider加入配置就行了。 这样做的缺点就是在配置中始终有一个开发时要用的provider,不过这样也无可厚非咯。 :joy:

  • baocaixiong
    2年前

    妈蛋,没仔细读文章。。。。。 上面有说了。。。

  • NauxLiu https://github.com/nauxliu
    2年前

    @baocaixiong @baocaixiong if 那里 $this 改漏掉了。。

  • freefcw
    2年前

    直接写在appServiceProvider里面也就可以了吧

  • NauxLiu https://github.com/nauxliu
    2年前

    @freefcw 都可以,只要加载流程对了就行。

  • fengming
    2年前
            if ($this->app->environment('local')) 
            {
                $this->app->register('Barryvdh\Debugbar\ServiceProvider');
                //$this->app->bind('Debugbar','Barryvdh\Debugbar\Facade');
                $loader = \Illuminate\Foundation\AliasLoader::getInstance();
                $loader->alias('Debugbar','Barryvdh\Debugbar\Facade');
            }

    对于alias 这么加载时是可以的,但是有点复杂,有啥好办法不。

  • NauxLiu https://github.com/nauxliu
    2年前

    @fengming alias 不用区分环境,直接写 app.php 里面即可。没有使用的话不会报错。

暂无评论~~
  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
Ctrl+Enter