Laravel 7.1 - URL::defaults() 在高优先级中间件中不工作
Laravel 7.1 - URL::defaults() not working in high priority middleware
我在我的项目中大量使用子域路由,因为它是一个多租户应用程序,每个租户都有自己的子域。
因此,我所有的路由都包含在:
Route::domain('{tenant}.'.config('app.base_url'))->group(function () {
// My routes here!
});
要在我的代码中使用 route()
帮助器,我需要将所有与其关联的路由参数传递给它。每条路线都有 tenant
与之关联,所以我经常发现自己在重复代码并编写 route('my-route-name', ['tenant' => $request->route('tenant')]);
我创建了一个中间件,其中包含以下代码:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use URL;
class SetTenantFromRequest
{
public function handle(Request $request, Closure $next)
{
list($subdomain) = explode('.', $request->getHost(), 2);
URL::defaults(['tenant' => $subdomain]);
return $next($request);
}
}
并将其放入 HTTP Kernel.php
文件中,如下所示:
protected $middleware = [
TrustProxies::class,
CheckForMaintenanceMode::class,
ValidatePostSize::class,
TrimStrings::class,
ConvertEmptyStringsToNull::class,
WebHeaders::class,
SetLanguage::class,
SetTenantFromRequest::class,
];
// Removed for brevity...
protected $middlewarePriority = [
StartSession::class,
ShareErrorsFromSession::class,
SetTenantFromRequest::class,
Authenticate::class,
ThrottleRequests::class,
AuthenticateSession::class,
SubstituteBindings::class,
Authorize::class,
];
我必须将它添加到 $middlewarePriority
数组,因为它需要 运行 在 Authenticate
中间件之前。由于 Authenticate
调用 return route('login');
,我需要事先提供 URL 参数。
现在做了所有这些,我仍然从 Authenticate
中间件中得到以下错误:Missing required parameters for [Route: login] [URI: login].
如果我在 Authenticate
中间件中 运行 ddd(URL::getDefaultParameters());
,它会打印一个空数组。但是,如果我 运行 在 SetTenantFromRequest
中间件中使用相同的 ddd(...)
,它会按照我的预期显示其中的租户。
有人知道我该如何解决这个问题吗?
将其从全局中间件堆栈移至 Web 中间件堆栈可缓解此问题。
这迫使我将租户参数添加到我的 Authenticate
中间件中的 route(...)
调用,但它确实允许我在其他任何地方放弃它。
我在我的项目中大量使用子域路由,因为它是一个多租户应用程序,每个租户都有自己的子域。
因此,我所有的路由都包含在:
Route::domain('{tenant}.'.config('app.base_url'))->group(function () {
// My routes here!
});
要在我的代码中使用 route()
帮助器,我需要将所有与其关联的路由参数传递给它。每条路线都有 tenant
与之关联,所以我经常发现自己在重复代码并编写 route('my-route-name', ['tenant' => $request->route('tenant')]);
我创建了一个中间件,其中包含以下代码:
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use URL;
class SetTenantFromRequest
{
public function handle(Request $request, Closure $next)
{
list($subdomain) = explode('.', $request->getHost(), 2);
URL::defaults(['tenant' => $subdomain]);
return $next($request);
}
}
并将其放入 HTTP Kernel.php
文件中,如下所示:
protected $middleware = [
TrustProxies::class,
CheckForMaintenanceMode::class,
ValidatePostSize::class,
TrimStrings::class,
ConvertEmptyStringsToNull::class,
WebHeaders::class,
SetLanguage::class,
SetTenantFromRequest::class,
];
// Removed for brevity...
protected $middlewarePriority = [
StartSession::class,
ShareErrorsFromSession::class,
SetTenantFromRequest::class,
Authenticate::class,
ThrottleRequests::class,
AuthenticateSession::class,
SubstituteBindings::class,
Authorize::class,
];
我必须将它添加到 $middlewarePriority
数组,因为它需要 运行 在 Authenticate
中间件之前。由于 Authenticate
调用 return route('login');
,我需要事先提供 URL 参数。
现在做了所有这些,我仍然从 Authenticate
中间件中得到以下错误:Missing required parameters for [Route: login] [URI: login].
如果我在 Authenticate
中间件中 运行 ddd(URL::getDefaultParameters());
,它会打印一个空数组。但是,如果我 运行 在 SetTenantFromRequest
中间件中使用相同的 ddd(...)
,它会按照我的预期显示其中的租户。
有人知道我该如何解决这个问题吗?
将其从全局中间件堆栈移至 Web 中间件堆栈可缓解此问题。
这迫使我将租户参数添加到我的 Authenticate
中间件中的 route(...)
调用,但它确实允许我在其他任何地方放弃它。