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