在 Laravel 5.7 的子域组中设置命名路由

Eru*_*iel 3 php laravel laravel-routing laravel-5

我一直在开发一个多租户应用程序,我正在尝试根据文档在子域中设置路由:https : //laravel.com/docs/5.7/routing#route-group-sub-domain -路由

在我的web.php路由文件中,我有这样的东西:

Route::domain('{account}.example.test')->group(function () {        
    Route::get('/home', 'HomeController@index')->name('home');        
});
Run Code Online (Sandbox Code Playgroud)

现在,问题是在刀片中使用命名路由,但我想我最终可能会在我的控制器中遇到同样的问题。

每当我尝试使用这样的命名路由时:

刀片代码

<a href="{{ route('home') }}">Home</a>
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

缺少 [Route: home] [URI: home] 的必需参数。(查看:/home/vagrant/Code/example/resources/views/example.blade.php)

我找到了解决这个问题的方法,你只需要:

<a href="{{ route('home', request('account')) }}">Home</a>
Run Code Online (Sandbox Code Playgroud)

我还使用助手“解决”了这个问题......

<a href="{{ route('home') }}">Home</a>
Run Code Online (Sandbox Code Playgroud)

所以我可以像这样使用它:

<a href="{{ acctRoute('home') }}">Home</a>
Run Code Online (Sandbox Code Playgroud)

但我仍然想知道是否有更干净的方法来做到这一点,也许使用一些总是注入参数的中间件?

Eru*_*iel 10

这是我对我自己问题的回答,以防将来有人需要这个:

从这里我注意到您可以为中间件下的所有路由设置默认值:https : //laravel.com/docs/5.7/urls#default-values

所以......这就是我最终做的

首先创建中间件:

php artisan make:middleware MyMiddleware

然后更新创建的中间件中的 handle 方法,如文档示例所示:

public function handle($request, Closure $next)
{
    URL::defaults(['account' => request('account')]);

    return $next($request);
}
Run Code Online (Sandbox Code Playgroud)

然后在 Kernel.php 中注册中间件

protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
    'mymiddle' => \App\Http\Middleware\MyMiddleware::class,
];
Run Code Online (Sandbox Code Playgroud)

然后将其用作路由文件中的任何其他中间件:

Route::domain('{account}.example.test')->middleware('mymiddle')->group(function () {        
    Route::get('/home', 'HomeController@index')->name('home');        
});
Run Code Online (Sandbox Code Playgroud)

最后,像往常一样使用路由辅助函数:

<a href="{{ route('home') }}">Home</a>
Run Code Online (Sandbox Code Playgroud)