php Laravel使用中间件设置配置值

aemubtdh  于 2023-09-29  发布在  PHP
关注(0)|答案(2)|浏览(99)

在我的laravel包中,我想使用全局中间件设置新的配置值
因此,我使用服务提供者注册中间件

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);
    }

我做了测试,中间件注册正确,但我仍然不能在运行时设置配置值。
唯一对我有效的是当我在服务提供商 Boot 方法中设置配置值时。

public function boot()
    {

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

     ....

}
dzhpxtsq

dzhpxtsq1#

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

use Illuminate\Support\Facades\Config;

Config::set('app.name','new value');

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

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

x7rlezfr2#

中间件在服务提供者和配置加载之后执行。这意味着在初始化Mail堆栈时,它采用“旧”配置值。
在中间件中设置配置之后,您应该做类似于下面的事情,因为您正在使用MailServiceProvider

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

无论如何,在中间件中更改配置值是一个不好的做法(正如您所看到的,它并不总是工作),您必须在服务提供者中这样做。
这也是因为中间件不会在非http场景中执行(作业队列、artisan命令、计划任务……)
反正

相关问题