Получите переопределенную конфигурацию с ПО промежуточного слоя от поставщика услуг

У меня проблема с привязкой класса в сервисном контейнере. это мой маршрут.

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

это мой пользовательский поставщик услуг для привязки 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);
        });
    }
}

и это мое промежуточное ПО для пользовательского маршрута для переопределения config 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, значение config services.firebase.* равно null, потому что ServiceProvider зарегистрирован до промежуточного программного обеспечения маршрута.

и как это решить?

Спасибо.


person rslhdyt    schedule 07.02.2017    source источник


Ответы (2)


Вам не следует регистрировать поставщика услуг в файле config/app.php. Зарегистрируйте поставщика FirebaseClientServiceProvider в промежуточном программном обеспечении PartnerMiddleware динамически.

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);
    }
}
person Mahbub    schedule 07.02.2017

Что ж, промежуточное программное обеспечение выполняется намного позже, чем ваш поставщик услуг, поэтому переопределение конфигурации не имеет никакого эффекта. Вы должны связать свою службу после изменения конфигурации.

Почему бы вам не перенести привязку в промежуточное ПО? Просто скопируйте и вставьте весь блок из register() и поместите его после config() в промежуточное ПО.

В качестве альтернативы, вместо разрешения через контейнер службы, вы можете подключить клиент Firebase к объекту запроса в промежуточном программном обеспечении после config().

person Denis Mysenko    schedule 07.02.2017