为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel 7.1 - URL::defaults() 在高优先级中间件中不起作用

Laravel 7.1 - URL::defaults() 在高优先级中间件中不起作用

PHP
梵蒂冈之花 2022-10-28 15:14:39
我在我的项目中大量使用子域路由,因为它是一个多租户应用程序,每个租户都有自己的子域。结果,我的所有路线都包含在:Route::domain('{tenant}.'.config('app.base_url'))->group(function () {    // My routes here!});要route()在我的代码中使用帮助程序,我需要向它传递与之关联的所有路由参数。每条路线都tenant与之相关,所以我经常发现自己重复代码和写作route('my-route-name', ['tenant' => $request->route('tenant')]);我创建了一个中间件,其中包含以下代码:<?phpnamespace 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中间件中运行相同的程序,它会按照我的预期显示租户。有谁知道我如何解决这个问题?
查看完整描述

1 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

将其从全局中间件堆栈移动到 Web 中间件堆栈可以缓解这个问题。

这迫使我将租户参数添加到route(...)我的中间件中的调用中Authenticate,但它确实允许我在其他任何地方放弃它。


查看完整回答
反对 回复 2022-10-28
  • 1 回答
  • 0 关注
  • 159 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信