重定向到没有查询字符串的命名路由

时间:2014-09-04 08:39:58

标签: laravel laravel-4 laravel-routing

我已经用这种方式定义了路线:

/*
 * Set up route patterns - patterns will have to be the same as
 * in translated route for current language
 */
foreach(Lang::get('routes') as $k => $v) {
    Route::pattern($k, $v);
}

Route::group(array('prefix' => Config::get('app.locale_prefix')), function()
{
    Route::get('/{login}/', ['as' => 'login', 'uses' => 'LoginController@showLogin']);
});

根据选定的语言,{login}参数将以英语显示为login,例如在波兰语中为logowanie,并且路线正常运行。

但是我在创建指定路线的重定向时遇到问题。

如果我只是使用:

Redirect::route('login'));

如果将我重定向到http://localhost/{login}网址,则根据当前语言,参数不会更改为loginlogowanie

另一方面,如果我使用:

Redirect::route('login', Lang::get('routes'));

当然在routes.php文件中我有很多路由它会创建以下网址:

http://localhost/logowanie?register=rejestracja&dashboard=konto&logout=wyloguj

因此它将处理正确的{login}参数,但它会将其他数组元素添加到查询字符串中的url。

当然我可以在这种情况下只使用一个路由元素但是它会为每个路由设置我必须手动传递所选参数而不是整个数组。

问题 - 是否可以像上面那样传递整个路径数组,但是只能在不添加查询字符串的情况下以某种方式处理Laravel中包含的参数?

2 个答案:

答案 0 :(得分:1)

我不确定我是否理解正确,但您始终只能定义一条翻译路线。

Route::get('/'.Lang::get('routes.login'), ['as' => 'login', 'uses' => 'LoginController@showLogin']);

Redirect::route('login');

<强>更新 请注意Lang :: get(&#39; routes&#39;)获取整个路由转换数组(至少我假设你这样定义)。在你的第二次尝试中它应该与

一起使用
Redirect::route('login', Lang::get('routes.login'));

答案 1 :(得分:0)

我最终做了什么:

我创建了Redirection外观(不是Redirect,而是Redirection) - 这是因为似乎很难扩展Redirect和UrlGenerator(它们在路由服务提供商中)并且它会在这种情况下是必要的。

由Facade创建的

Redirection类按以下方式定义:

<?php

namespace Utils;

use \Lang;
use \URL;
use \Redirect;


use Illuminate\Routing\UrlGenerator;

class Redirection
{


    /**
     * Create a new redirect response to a named route and automatically adds
     * translated route variables.
     *
     * @param  string $route
     * @param  array  $parameters
     * @param  int    $status
     * @param  array  $headers
     *
     * @return \Illuminate\Http\RedirectResponse
     */
    public function route(
        $route,
        $parameters = array(),
        $status = 302,
        $headers = array()
    ) {
        $routeUrl = urldecode(URL::route($route));

        preg_match_all('/{(.*)}/', $routeUrl, $matches);

        foreach ($matches[1] as $parameter) {
            $parameters[$parameter] = Lang::get('routes.' . $parameter);
        }

        return Redirect::route($route, $parameters, $status, $headers);
    }
} 

现在,如果我想重定向到命名路由,我不使用:

 Redirect::route('login');

 Redirection::route('login');

并将所有必需的路由作为route方法参数传递给Redirect外观。