在 Laravel 5.7 的子域组中设置命名路由
Setting up named routes within a subdomain group in Laravel 5.7
我一直在开发 multi-tenant 应用程序,我正在尝试根据文档在 sub-domains 中设置路由:https://laravel.com/docs/5.7/routing#route-group-sub-domain-routing
在我的web.php路由文件中,我有这样的东西:
Route::domain('{account}.example.test')->group(function () {
Route::get('/home', 'HomeController@index')->name('home');
});
现在,问题是在 blade 中使用命名路由,但我想我最终可能 运行 在我的控制器中遇到同样的问题。
每当我尝试使用这样的命名路由时:
Blade代码
<a href="{{ route('home') }}">Home</a>
我收到以下错误:
Missing required parameters for [Route: home] [URI: home]. (View: /home/vagrant/Code/example/resources/views/example.blade.php)
我找到了解决这个问题的方法,你只需要:
<a href="{{ route('home', request('account')) }}">Home</a>
我也"solved"使用助手...
if (! function_exists('acctRoute')) {
function acctRoute($name = '')
{
return route( $name, request('account'));
}
}
所以我可以像这样使用它:
<a href="{{ acctRoute('home') }}">Home</a>
但我仍然想知道是否有更简洁的方法来执行此操作,也许使用一些始终注入参数的中间件?
您可以在所有视图中共享帐户(子域)变量:
// AppServiceProvider
public function boot()
{
View::share('subdomain', request('account'));
}
// blade
<a href="{{ route('home', $subdomain) }}">Home</a>
另一种方法可以使用服务容器绑定:
// AppServiceProvider
$this->app->bind('account.route', function () {
return route('home', request('route'));
});
// blade
<a href="{{ app('account.route') }}">Home</a>
这是我对自己问题的回答,以防将来有人需要:
从这里我注意到您可以为中间件下的所有路由设置默认值:
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);
}
然后在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,
];
然后将它用作路由文件中的任何其他中间件:
Route::domain('{account}.example.test')->middleware('mymiddle')->group(function () {
Route::get('/home', 'HomeController@index')->name('home');
});
最后,照常使用路由辅助函数:
<a href="{{ route('home') }}">Home</a>
我一直在开发 multi-tenant 应用程序,我正在尝试根据文档在 sub-domains 中设置路由:https://laravel.com/docs/5.7/routing#route-group-sub-domain-routing
在我的web.php路由文件中,我有这样的东西:
Route::domain('{account}.example.test')->group(function () {
Route::get('/home', 'HomeController@index')->name('home');
});
现在,问题是在 blade 中使用命名路由,但我想我最终可能 运行 在我的控制器中遇到同样的问题。
每当我尝试使用这样的命名路由时:
Blade代码
<a href="{{ route('home') }}">Home</a>
我收到以下错误:
Missing required parameters for [Route: home] [URI: home]. (View: /home/vagrant/Code/example/resources/views/example.blade.php)
我找到了解决这个问题的方法,你只需要:
<a href="{{ route('home', request('account')) }}">Home</a>
我也"solved"使用助手...
if (! function_exists('acctRoute')) {
function acctRoute($name = '')
{
return route( $name, request('account'));
}
}
所以我可以像这样使用它:
<a href="{{ acctRoute('home') }}">Home</a>
但我仍然想知道是否有更简洁的方法来执行此操作,也许使用一些始终注入参数的中间件?
您可以在所有视图中共享帐户(子域)变量:
// AppServiceProvider
public function boot()
{
View::share('subdomain', request('account'));
}
// blade
<a href="{{ route('home', $subdomain) }}">Home</a>
另一种方法可以使用服务容器绑定:
// AppServiceProvider
$this->app->bind('account.route', function () {
return route('home', request('route'));
});
// blade
<a href="{{ app('account.route') }}">Home</a>
这是我对自己问题的回答,以防将来有人需要:
从这里我注意到您可以为中间件下的所有路由设置默认值: 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);
}
然后在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,
];
然后将它用作路由文件中的任何其他中间件:
Route::domain('{account}.example.test')->middleware('mymiddle')->group(function () {
Route::get('/home', 'HomeController@index')->name('home');
});
最后,照常使用路由辅助函数:
<a href="{{ route('home') }}">Home</a>