php - Laravel 7.1 - URL::defaults() 在高优先级中间件中不起作用
问题描述
我在我的项目中大量使用子域路由,因为它是一个多租户应用程序,每个租户都有自己的子域。
结果,我的所有路线都包含在:
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);
}
}
并将其放在 HTTPKernel.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].
如果我ddd(URL::getDefaultParameters());
在Authenticate
中间件中运行,它会打印一个空数组。但是,如果我ddd(...)
在SetTenantFromRequest
中间件中运行相同的程序,它会按照我的预期显示租户。
有谁知道我如何解决这个问题?
解决方案
将其从全局中间件堆栈移动到 Web 中间件堆栈可以缓解这个问题。
这迫使我将租户参数添加到route(...)
我的中间件中的调用中Authenticate
,但它确实允许我在其他任何地方放弃它。
推荐阅读
- r - 导入 .csv 数据时如何将“NA”读取为字符串?不设置 na.strings = ""
- javascript - 运行 js 函数 n 次
- r - R如何更改图形的形状/大小另存为png
- java - Java.lang.Error:java.lang.NoSuchFieldException:覆盖
- python - 尝试附加数据帧时出现值错误
- django - 有没有人成功地将 Reverse 与命名空间、rest_framework 和主机模式一起使用?
- firebase - Firebase 移动身份验证何时向我收费?
- php - PhpHtmlPraser html 查找功能不起作用
- javascript - 如何从 Bootstrap Selectpicker 获取数据子文本的值?
- angular - 角度创建输入组件可重用