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

linjiqin 阅读:266 2025-06-02 22:19:02 评论:0

我一直在开发一个 Multi-Tenancy 应用程序,我正在尝试根据文档在子域中设置路由: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 中使用命名路由,但我想我最终可能会在我的 Controller 中遇到同样的问题。

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

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> 

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

if (! function_exists('acctRoute')) { 
    function acctRoute($name = '') 
    { 
        return route( $name, request('account')); 
    } 
} 

所以我可以像这样使用它:
<a href="{{ acctRoute('home') }}">Home</a> 

但我仍然想知道是否有更清洁的方法来做到这一点,也许是一些总是注入(inject)参数的中间件?

请您参考如下方法:

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

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

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

首先创建中间件:
php artisan make:middleware MyMiddleware
然后更新已创建中间件中的句柄方法,如文档示例中所示:

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> 


标签:PHP
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号