嵌套Route::group';情况下的Laravel本地化和命名路由;s


Laravel localization and named routes in case of nested Route::group's

出于本地化目的,我需要通过url传递语言代码,但遇到了嵌套Route::group的问题。

我现在的路线是这样的:

Route::group(['prefix' => 'employee', 'namespace' => 'Employee'], function()
{
    Route::resource('user', 'UserController', ['only' => ['show', 'index']]);
});

这意味着我已经命名了employee.user.showemployee.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.showen.employee.user.index等,这很不方便,因为这让我一直在传递语言。我的问题与这里描述的问题相似https://github.com/laravel/framework/issues/1616

我现在可以想出几个解决方案:

1) 完全不使用资源,手动定义所有POSTGET等路由,使用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)我需要以某种方式覆盖UrlGeneratorroute方法,这样我仍然可以使用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参数。