Локаль Laravel 5.5 в качестве префикса в URL


На данный момент у меня в routes/web.php есть следующее:

Route::group( [ 'prefix' => '{locale?}', 'middleware' =>\App\Http\Middleware\Locale::class ], function (\Illuminate\Routing\Router $router) {

    Route::get( '/', 'LandingController@index' )->name( 'home' );
    Route::get( '/hero/create', 'HeroController@create' )->name( 'hero.create' );
} );

На самом деле это работает не так, как должно быть.

Я хочу, чтобы у меня был такой URL-адрес:

/create/hero    # should work with the default locale
/fr/create/hero # should use the french locale
/nl/create/hero # should use dutch locale
/               # should work with the default locale
/fr             # should use the french locale
/nl             # should use dutch locale

Поэтому я хочу, чтобы параметр locale был необязательным в начале URL-адреса. До сих пор мне удавалось добиться того, чтобы URL-адреса работали только при самостоятельном указании локали. Я всегда получаю сообщение not found, когда не указываю локаль вручную.

Я знаю, что должен быть в состоянии сделать это так это:

Route::get('/path/{id}/{start?}/{end?}', ['as' => 'route.name', 'uses' => 'PathController@index']);

public function index($id, $start = "2015-04-01", $end = "2015-04-30")
{
    // code here
}

Но я думаю, что это "но" означало бы, что я должен установить локаль по умолчанию в каждом контроллере, что, на мой взгляд, немного некрасиво. Кроме того, я думаю, что это должно быть возможно более элегантным способом в Laravel.

Как я могу установить значение по умолчанию для префикса locale в моем URL-адресе?

Author: TheatreOfSouls, 2018-02-01

1 answers

Вы должны глубоко продумать сгенерированные маршруты. И никогда не используйте префикс как необязательный, поэтому, чтобы заставить работать все URL-адреса, измените маршрут следующим образом

Route::get( '/', 'LandingController@index' )->name( 'home' );
Route::get( '/hero/create', 'HeroController@create' )->name( 'hero.create' );

Route::group( [ 'prefix' => '{locale}', 'middleware' =>\App\Http\Middleware\Locale::class ], function (\Illuminate\Routing\Router $router) {
    Route::get( '/', 'LandingController@index' )->name( 'home' );
    Route::get( '/hero/create', 'HeroController@create' )->name( 'hero.create' );
} );

Вот краткое описание вашего пути

/               # should work with first above route 
/create/hero    # should work with first above route
/fr/create/hero # should work with route inside prefix
/nl/create/hero # should work with route inside prefix
/fr             # should work with route inside prefix
/nl             # should work with route inside prefix

Это можно решить либо поставить необязательный ({локаль?}) в конце концов, не между ними, или вы можете просто поместить маршрут в переменную и ввести оба условия, я имею в виду внешний префикс и внутренний префикс.

$heroRoutes = function (\Illuminate\Routing\Router $router) {
    Route::get( '/', 'LandingController@index' )->name( 'home' );
    Route::get( '/hero/create', 'HeroController@create' )->name( 'hero.create' );
}
Route::group( [ 'middleware' =>\App\Http\Middleware\Locale::class ], $heroRoutes );
Route::group( [ 'prefix' => '{locale}', 'middleware' =>\App\Http\Middleware\Locale::class ], $heroRoutes );
 4
Author: C2486, 2018-02-01 16:29:17