代码之家  ›  专栏  ›  技术社区  ›  Marcin Nabiałek

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

  •  1
  • Marcin Nabiałek  · 技术社区  · 10 年前

    我这样定义了路线:

    /*
     * 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-参数不会更改为 登录 洛格瓦尼语 取决于当前语言。

    另一方面,如果我使用:

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

    当然,在 routes.php 文件我有许多路由,它将创建以下url:

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

    所以它会处理正确 {登录} 参数,但它将向查询字符串中的url添加其他数组元素。

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

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

    2 回复  |  直到 10 年前
        1
  •  1
  •   Sloothword    10 年前

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

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

    Redirect::route('login');
    

    使现代化 请注意,Lang::get('routes')获取了整个路由转换数组(至少我假设您是这样定义的)。在你的第二次尝试中,它应该与

    Redirect::route('login', Lang::get('routes.login'));
    
        2
  •  0
  •   Marcin Nabiałek    10 年前

    我最终做了什么:

    我创建了 Redirection 立面(不是 Redirect 但是 重定向 )-这是因为似乎很难同时扩展Redirect和UrlGenerator(它们在路由服务提供商中),在这种情况下这是必要的。

    重定向 facade创建的类的定义如下:

    <?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 方法参数 重新使用 外观