【问题标题】:Laravel set config values using middlwareLaravel 使用中间件设置配置值
【发布时间】:2019-05-23 06:41:28
【问题描述】:

在我的 laravel 包中,我想使用 Global Middlware 设置新的配置值

所以,我使用服务提供者注册中间件

public function boot()
    {
        Route::middlewareGroup('mypackagename', config('mypackagename.middleware', []));
        .....

然后我在包配置文件中设置中间件类,如下所示:

'middleware' => [
        'web',
        qoraiche\mypackagename\Http\Middleware\setConfigs::class,
    ],

setConfigs 中间件:

public function handle($request, Closure $next)
    {
        // --
        config(['mail.from.name' => 'New Name']);

        return $next($request);
    }

我做了测试并且正确注册了中间件,但我仍然无法在运行时设置配置值。

唯一对我有用的是当我在服务提供商启动方法中设置配置值时。

public function boot()
    {

     config(['mail.from.name' => 'New Name']);

     ....

}

【问题讨论】:

    标签: php laravel laravel-5 environment-variables


    【解决方案1】:

    中间件在服务提供者和配置加载后执行。这意味着当邮件堆栈初始化时,它采用“旧”配置值。

    鉴于您正在使用MailServiceProvider,在中间件中设置配置后,您应该这样做。

    (new Illuminate\Mail\MailServiceProvider(app()))->register();
    

    无论如何,更改中间件中的配置值是一种不好的做法(如您所见,它并不总是有效),您必须在服务提供商中这样做。

    这也是因为中间件不会在非 http 场景中执行(作业队列、工匠命令、计划任务......)

    不管怎样

    【讨论】:

    • 但是我不能在服务提供商中使用模型和数据库,我正在尝试从数据库中获取设置并将它们设置在配置中。 @leonardo-rossi
    • 为什么你说你不能在服务提供者中使用模型和数据库?您可以在boot()DB 外观中使用您的模型,也可以在register() 中使用
    • 这是一种不好的做法,这会影响我的软件包声誉,为什么要设置配置值,直接(以编程方式)编辑配置文件最好?
    • 恕我直言,在服务提供者中使用 DB 外观并不是一个坏习惯。使用您自己的配置文件并发布它,以便用户可以配置它。没有太多上下文很难给你答案。
    【解决方案2】:

    对于 Laravel 5,6,7,我可以确认,如果你想通过中间件设置配置值,你需要使用 Illuminate\Support\Facades\Config façade 和 set 方法为在:

    use Illuminate\Support\Facades\Config;
    
    Cookie::set('app.name','new value');
    

    辅助方法在中间件中不起作用,但在大多数其他地方:

    cookie(['app.name' => 'new value'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 2013-09-19
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      相关资源
      最近更新 更多