【问题标题】:Redirect to named routes without query string重定向到没有查询字符串的命名路由
【发布时间】:2014-10-28 22:26:06
【问题描述】:

我是这样定义路线的:

/*
 * 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} url - 参数不会更改为 loginlogowanie,具体取决于当前语言。

另一方面,如果我使用:

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

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

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

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

当然,在这种情况下,我可以只使用一个路由元素,但是对于每条路由,我都必须手动传递选定的参数,而不是整个数组。

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

【问题讨论】:

    标签: laravel laravel-4 laravel-routing


    【解决方案1】:

    我不确定我是否正确理解你,但你总是可以只定义一个翻译路线。

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

    Redirect::route('login');
    

    更新 并且请注意, Lang::get('routes') 获得了整个路线翻译数组(至少我假设你是这样定义的)。在您的第二次尝试中,它应该与

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

    【讨论】:

    • 这可能是真的,我可以这样定义它们,但如果我有很多路线,它就不会那么清晰了。我知道Lang::get('routes') 给了我整个数组,但我希望Redirect 只使用那些在路线中的那些,而不是在{login} 部分之后创建queryString。我在问题中提到过。
    • 我猜这是不可能的,因为 Laravel 假定路由中未使用的 Redirect::route('login', $parameters); 调用中的所有参数都是 GET 参数。我也看不出我的路线定义比你做的要长。也许以许多路线为例。此外,如果您根本不触摸翻译等来创建路线,它会更干净。
    • 好吧,但我的主要观点是为每种语言在 url 中翻译路线。我使用这里描述的方法:stackoverflow.com/q/25082154/3593996
    • 我知道你来自哪里。但是使用这种方法,我想必须手动指定{login} 变量Redirect::route('login', ['login'=>'loginInAnyLanguage']);。因此,我提供了另一种方法来定义翻译后的路线,而无需这样做。如果您对此有具体问题,我会很乐意提供帮助。否则,您可能会问解决方案的原始作者他将如何概括链接。
    【解决方案2】:

    我最终做了什么:

    我创建了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外观。

    【讨论】:

      猜你喜欢
      • 2014-03-06
      • 2013-11-02
      • 2014-11-04
      • 2015-03-25
      • 1970-01-01
      • 1970-01-01
      • 2018-12-02
      • 2018-05-10
      • 1970-01-01
      相关资源
      最近更新 更多