Мне нужно передать языковой код через URL для целей локализации, но возникла проблема с вложенным Route::group
,
Мои маршруты на данный момент выглядят так:
Route::group(['prefix' => 'employee', 'namespace' => 'Employee'], function()
{
Route::resource('user', 'UserController', ['only' => ['show', 'index']]);
});
Это означает, что я назвал маршруты как employee.user.show
, employee.user.index
и т. д. и URL, как это /employee/user/2
, /employee/user
и т.п.
Мне нужно оставить названия маршрутов как есть, но изменить свой URL на такой /en/employee/user/2
, /en/employee/user
и т.д., чтобы код языка всегда передавался через URL.
Когда я пытаюсь обернуть свои маршруты новыми Route::group
как это:
Route::group(['prefix' => 'en'], function() {
Route::group(['prefix' => 'employee', 'namespace' => 'Employee'], function()
{
Route::resource('user', 'UserController', ['only' => ['show', 'index']]);
});
});
Я получаю URL-адреса в нужной форме, но имена маршрутов становятся en.employee.user.show
, en.employee.user.index
и т.д., что очень неудобно, потому что я постоянно говорю на языке. Моя проблема похожа на описанную здесь https://github.com/laravel/framework/issues/1616
Теперь я могу думать о нескольких решениях:
1) не использовать ресурсы вообще и определить все POST
, GET
и т.д. маршруты вручную и использовать as
для наименования маршрута;
2) использовать action('Employee\UserController@show')
вместо route('employee.user.show')
и постоянно передавать язык как дополнительный параметр;
3) как-то переопределить route
метод, так что каждый раз к параметрам добавляется еще один paratemer с именем lang
с языковым кодом в качестве значения (использует локаль как route('employee.user.show', ['lang' => 'en'])
или использует текущую локаль сайта, если нет lang
параметр предоставляется вручную), поэтому каждый раз, когда я вызываю этот метод, я получаю URL /employee/user/2?lang=en
и т. д. (или получить этот URL, даже не передавая lang
параметр, если текущая локаль установлена на en
).
На каждом решении:
1) первое решение уродливо, потому что мне нужно написать 7 строк с дополнительными параметрами вместо простого короткого однострочного объявления ресурса;
2) второе решение заставляет меня все время писать все пространства имен, имена контроллеров и имена методов, а также добавлять языковые параметры — все это тоже безобразно;
3) мне нужно как-то перезаписать UrlGenerator
«s route
метод, так что я все еще могу использовать route
метод, но с расширенной функциональностью. Как я могу переопределить этот метод в Laravel 4.2?
Для того, чтобы добавить Google-как lang
параметр, который автоматически присоединяется ко всем URL, необходимо переопределить route
помощник. Вот шаги:
1) создать отдельный файл, скажем helpers_override.php
и положить где-нибудь, например в app
папки;
2) в index.php
файл до регистрация автозагрузчика (то есть перед линией require __DIR__.'/../bootstrap/autoload.php';
) вы должны требовать вашего helpers_override.php
(в моем случае так require __DIR__.'/../app/helpers_override.php';
Очень route
помощник, который добавит lang
Параметр для каждого маршрута выглядит так:
if ( ! function_exists('route'))
{
/**
* Generate a URL to a named route.
*
* @param string $name
* @param array $parameters
* @param bool $absolute
* @param \Illuminate\Routing\Route $route
* @return string
*/
function route($name, $parameters = array(), $absolute = true, $route = null)
{
$parameters = (array) $parameters;
if ( ! key_exists('lang', $parameters))
{
$parameters['lang'] = App::getLocale();
}
return app('url')->route($name, $parameters, $absolute, $route);
}
}
В результате нам не нужно создавать отдельные Route::group
и использовать уродливые названия маршрутов, такие как en.employer.user.show
и т.д., мы до сих пор сохраняем чистоту route
помощник, нам не надо сдавать lang
параметры вручную все время. Мы можем даже сделать еще несколько модификаций и добавить lang
Параметр только в случае, если язык отличается от языка по умолчанию.
Других решений пока нет …