簡體   English   中英

在Laravel 5.7的子域組中設置命名路由

[英]Setting up named routes within a subdomain group in Laravel 5.7

我一直在開發多租戶應用程序,並且嘗試根據文檔在子域中設置路由: 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');        
});

現在,問題是在刀片中使用命名路由,但是我想我最終可能會在控制器中遇到相同的問題。

每當我嘗試使用這樣的命名路由時:

刀片代碼

<a href="{{ route('home') }}">Home</a>

我收到以下錯誤:

[Route:home] [URI:home]缺少必需的參數。 (查看:/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>

但是我仍然想知道是否有更清潔的方法來執行此操作,也許是使用總是注入參數的中間件?

您可以在所有視圖中共享account(子域)變量:

// 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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM