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);
    }
}

И поместил его в файл 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].

Если я запускаю ddd(URL::getDefaultParameters()); в промежуточном программном обеспечении Authenticate, он печатает пустой массив. Однако, если я запускаю тот же ddd(...) в промежуточном программном обеспечении SetTenantFromRequest, он показывает там арендатора, как я и ожидал.

Кто-нибудь знает, как я могу решить эту проблему?


person Liam Bull    schedule 12.03.2020    source источник


Ответы (1)


Перемещение этого из глобального стека промежуточного программного обеспечения в стек веб-промежуточного программного обеспечения облегчает проблему.

Это вынуждает меня добавлять параметр tenant к вызову route(...) в моем промежуточном программном обеспечении Authenticate, но позволяет мне отказаться от него везде.

person Liam Bull    schedule 12.03.2020
comment
Я все еще был бы признателен любому, кто может объяснить, почему это так. Перемещение его в начало веб-стека приводит к тому, что код работает для всех других применений помощника маршрута в проекте, но перемещение его в конец глобального стека приводит к сбою. Явно что-то происходит между выполнением этих двух стеков, но я не уверен, что именно. - person Liam Bull; 12.03.2020