出于本地化目的,我需要通过url传递语言代码,但遇到了嵌套Route::group
的问题。
我现在的路线是这样的:
Route::group(['prefix' => 'employee', 'namespace' => 'Employee'], function()
{
Route::resource('user', 'UserController', ['only' => ['show', 'index']]);
});
这意味着我已经命名了employee.user.show
、employee.user.index
等路由和/employee/user/2
、/employee/user
等URL。
我需要保留路由名称,但将我的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) 一直使用CCD_ 14代替CCD_;
3) 以某种方式重写route
方法,以便每次向参数添加一个名为lang
的辅助对象,并将语言代码作为其值(使用类似route('employee.user.show', ['lang' => 'en'])
的区域设置,或者如果没有手动提供lang
参数,则使用当前站点区域设置),所以每次我调用这个方法时,我都会得到类似/employee/user/2?lang=en
等的URL(或者如果当前区域设置为en
,则接收这个URL,甚至不传递任何lang
参数)。
在每个解决方案上:
1) 第一个解决方案很难看,因为我必须用额外的params写7行,而不是简单的短的单行资源声明;
2) 第二个解决方案让我一直写所有的名称空间、控制器名称和方法名称,还添加了语言参数——所有这些也太难看了;
3)我需要以某种方式覆盖UrlGenerator
的route
方法,这样我仍然可以使用route
方法,但具有增强的功能。如何在Laravel 4.2中覆盖此方法
为了添加自动附加到所有URL的类似谷歌的lang
参数,需要覆盖route
助手。以下是步骤:
1) 创建一些单独的文件,比如helpers_override.php
,并将其放在某个位置,例如放在app
文件夹中;
2) 在自动加载器注册之前(即require __DIR__.'/../bootstrap/autoload.php';
行之前)的index.php
文件中,您必须要求您的helpers_override.php
(在我的情况下,如require __DIR__.'/../app/helpers_override.php';
将lang
参数添加到每条路由的route
助手如下所示:
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
参数。