laravel - 使用服务提供商的中间件获取覆盖的配置

标签 laravel laravel-5 service-provider laravel-middleware

我在服务容器中绑定(bind)类时遇到问题。这是我的路线。

Route::group(['middleware' => 'partner', 'domain' => '{partner}.example.com'], function() {
    $firebaseClient = app('App\Services\FirebaseClient');
    $firebaseClient->pushData('users.json', ['name' => 'Risal Ganteng']);
});

这是我用于绑定(bind) FirebaseClient 的自定义服务提供程序。

class FirebaseClientServiceProvider extends ServiceProvider 
{

    /**
    * Register FirebaseClient class with the Laravel IoC container.
    *
    * @return void
    */
    public function register()
    {
        $this->app->bind(\App\Services\FirebaseClient::class, function($app)
        {
            $config = $app['config'];

            $options = [
                'api_version' => $config['services.firebase.api_version']
            ];

            return new \App\Services\FirebaseClient($config['services.firebase.database_url'], $options);
        });
    }
}

这是我的自定义路由中间件,用于基于子域覆盖配置 services.firebase。

class PartnerMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $partner_id = $request->route('partner');

        $partner = Partner::findOrFail($partner_id);

        // set config
        config([
            'services.firebase.api_key' => $partner->firebase_api_key,
            'services.firebase.auth_domain' => $partner->firebase_auth_domain,
            'services.firebase.database_url' => $partner->firebase_database_url,
        ]);

        return $next($request);
    }
}

问题是,当我尝试在 FirebaseServiceProvider 中获取配置时,配置 services.firebase.* 值为 null,因为 ServiceProvider 在路由中间件之前注册。

如何解决这个问题?

谢谢。

最佳答案

您不应在 config/app.php 文件中注册您的服务提供商。在 PartnerMiddleware 中间件中动态注册 FirebaseClientServiceProvider 提供程序。

class PartnerMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $partner_id = $request->route('partner');

        $partner = Partner::findOrFail($partner_id);

        // set config
        config([
            'services.firebase.api_key' => $partner->firebase_api_key,
            'services.firebase.auth_domain' => $partner->firebase_auth_domain,
            'services.firebase.database_url' => $partner->firebase_database_url,
        ]);


        app()->register(FirebaseClientServiceProvider::class);


        return $next($request);
    }
}

关于laravel - 使用服务提供商的中间件获取覆盖的配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42081952/

相关文章:

mysql - Laravel 在 MySQL 上迁移 150 错误

php - 找不到驱动程序

php - 从 hasMany 关系中获取所有对象并分页

php - laravel 5.4 redis服务器ddos攻击

php - Laravel 包注册异常处理器

php - 在 Laravel 中使用阿拉伯字符作为 Slug

php - Laravel 上传文件到项目目录外的不同存储

php - 断言页面上有一定数量的元素

android - 与服务提供商的通信失败 : No peer certificate in Twitter

laravel - 在特定路线上绑定(bind) Laravel 服务提供者