猿问

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中间件中运行相同的程序,它会按照我的预期显示租户。


有谁知道我如何解决这个问题?


梵蒂冈之花
浏览 219回答 1
1回答

ibeautiful

将其从全局中间件堆栈移动到 Web 中间件堆栈可以缓解这个问题。这迫使我将租户参数添加到route(...)我的中间件中的调用中Authenticate,但它确实允许我在其他任何地方放弃它。
随时随地看视频慕课网APP
我要回答