Локализация Laravel и именованные маршруты в случае вложенных Route :: group’s

Мне нужно передать языковой код через 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?

1

Решение

Для того, чтобы добавить 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 Параметр только в случае, если язык отличается от языка по умолчанию.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]