Я активно использую маршрутизацию поддоменов в своем проекте, так как это многопользовательское приложение, в котором каждый арендатор имеет свой собственный поддомен.
В результате все мои маршруты завернуты в:
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
, он показывает там арендатора, как я и ожидал.
Кто-нибудь знает, как я могу решить эту проблему?