Локаль 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-адресе?
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 );