【问题标题】:Redirecting with a query string in Laravel在 Laravel 中使用查询字符串重定向
【发布时间】:2022-03-30 22:19:50
【问题描述】:

在过去的某个时候,我的公司更改了我们的搜索工具以及 url 中搜索查询的格式。

它曾经是一个典型的查询参数:

/product-name-some-digits-12345?q=searchterm

但现在它作为一个片段发送:

/product-name-some-digits-12345##search:query=searchterm

我们对旧格式的页面进行了少量访问——要么是以太网中的链接,要么是用户在支持搜索的 JS 加载之前搜索。为了缓解这种情况,我想编写一条从旧格式重定向到新格式的路由。

我想我可以通过在路由文件web.php 中添加类似下面的内容来做到这一点:

Route::get(\'{base}?q={query}\', function ($base, $query) {
    // output for now, write redirect later
    dd($base . \'#search:query=\' . $query);
})->where([
    \'base\' => \'[^\\?]?\',
    \'query\' => \'.*\',
]);

但这条路线并没有被击中。

当存在查询字符串时,如何编写 Laravel 路由以执行操作?

    标签: php regex laravel routes query-string


    【解决方案1】:

    我不知道 Laravel 会如何翻译那条路线,但我对这条路线无法访问也不感到惊讶。要调试可用路由,您可以使用此 Artisan 命令:

    php artisan route:list
    

    通常,您不需要像?q={query} 那样直接在路由中定义查询字符串参数,因为您实际上不必这样做;查询字符串是隐式的;它们可以出现在任何路线上,但不是必需的。

    如果您将路由更改为简单的Route::get('{base}'),并添加对$request->has('q') 的检查,您应该能够处理重定向:

    Route::get('{base}', function ($base) {
      if (request()->has('q')) {
        return redirect()->url($base . '#search:query=' . request()->input('q'));
      }
      // ...
    });
    

    request() 在应用程序范围内可用,可用于检查查询字符串或正文/帖子参数。另一种方法是使用注入,例如:

    Route::get('{base}', function (Request $request, $base){ ... });
    

    然后使用$request->has()$request->input(),但它们在语法上是相同的。

    另一种方法是使用检查相同内容的中间件来包装您的路由。语法类似,因为您通过$request->has('q') 检查?q=whatever 的存在,并根据需要重定向或继续。可以在此处找到相关文档:

    https://laravel.com/docs/9.x/middleware

    【讨论】:

      猜你喜欢
      • 2014-11-03
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多