Laravel – порядок промежуточного ПО (приоритет промежуточного ПО). Мульти-арендатор с использованием Postgres

В web.php я переключил схемы Postgres в промежуточное программное обеспечение, когда был создан тип поддомена HTTP-запроса. Сюда:

Route::group( [ 'domain' => '{tenant}.' . config('app.url'), 'middleware' => 'select-schema' ], function () { $this->get('/', 'HomeController@index')->middleware('auth'); } ); 

В промежуточном программном обеспечении select-schema я делаю что-то вроде этого. Это работает правильно. (не волнуйтесь)

 DB::select('SET search_path TO ' . {tenant}); 

Моя основная проблема заключается в том, что: у меня разные migrations для public схемы и для любого individual tenant . У individual tenant меня есть таблица users . Как только я войду в систему, вы увидите эту ошибку.

SQLSTATE [42P01]: неопределенная таблица: 7 ОШИБКА: отношения «пользователи» не существуют

Основная проблема

 $this->get('/', 'HomeController@index')->middleware('auth'); 

Модель работает хорошо, но middleware auth выполняется сначала перед select-schema

Как заказать? select-schema затем auth

Вы пробовали обернуть свои маршруты в группе арендаторов другой группой? Посмотрите, работает ли это:

 Route::group([ 'domain' => '{tenant}.' . config('app.url'), 'middleware' => 'select-schema' ],function () { Route::group(['middleware' => 'auth'], function () { Route::get('/', 'HomeController@index'); }); } ); 

Я нашел решение, для этого есть что-то, называемое $middlewarePriority в App\Kernel .

Добавляя эту помощь, я решаю проблему.

 /** * Responsible for prioritizing the middleware * * @var array */ protected $middlewarePriority = [ \App\Http\Middleware\SwitchSchema::class, ]; 

У меня есть решение по этой ссылке.

https://github.com/laravel/framework/issues/19565