【问题标题】:Laravel 7.1 - URL::defaults() not working in high priority middlewareLaravel 7.1 - URL::defaults() 在高优先级中间件中不起作用
【发布时间】:2020-03-12 17:41:49
【问题描述】:

我在我的项目中大量使用子域路由,因为它是一个多租户应用程序,每个租户都有自己的子域。

结果,我所有的路由都包裹在:

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(...),它会按照我的预期显示租户。

有人知道我该如何解决这个问题吗?

【问题讨论】:

    标签: php laravel laravel-7


    【解决方案1】:

    将其从全局中间件堆栈移至 Web 中间件堆栈可缓解此问题。

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

    【讨论】:

    • 我仍然会感谢任何能够解释为什么会这样的人。将其移动到 Web 堆栈的开头会导致代码适用于项目中的所有其他路由助手用法,但将其移动到全局堆栈的末尾会导致它失败。显然这两个堆栈的执行之间发生了一些事情,但我不确定是什么。
    猜你喜欢
    • 2018-09-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2017-02-17
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多