Laravel中间件订单(中间件优先级)。使用Postgres的多租户

时间:2017-06-11 19:15:16

标签: php postgresql laravel middleware multi-tenant

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

该模型效果很好,但中间件auth先于select-schema

执行

如何订购? select-schema然后auth

2 个答案:

答案 0 :(得分:4)

我找到了解决方案, 为此,$middlewarePriority中有一个名为App\Kernel的内容。

添加此项可帮助我解决问题。

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

我已从此链接获得解决方案。

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

答案 1 :(得分:0)

您是否尝试将您的路线包装在租户组中?看看是否有效:

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