【问题标题】:How to URL encode a URI route parameter in Laravel如何在 Laravel 中对 URI 路由参数进行 URL 编码
【发布时间】:2020-08-04 07:03:57
【问题描述】:

我有一个 URI,我需要在路由中传递给控制器​​。我该如何处理,或者更具体地说,如何传递通常需要首先进行 URL 编码的字符串?这会不会是路由中的正则表达式约束 Howhandledy?

要传递的字符串

itm:n#_123445

路线

Route::get('getChildren/{uri}', 'ChildrenController@getChildren');

【问题讨论】:

  • 您是在尝试存储此 uri,还是使用此 uri 作为唯一标识符来获取一些其他数据以返回给用户?
  • @mchljams 我不需要存储它。这个 (itm:n#_123445) 将通过 AJAX 发送到 Laravel 路由:getChildren/itm:n#_123445。我想消除下划线和它之前的所有内容可能会更好。

标签: laravel laravel-routing laravel-7


【解决方案1】:

您可以使用URL 外观来做到这一点。 完整路径为Illuminate\Support\Facades\URL 或仅使用\URL,因为它已添加到config/app.php 文件中。

用法
URL::to('/getChildren', ['itm:n#_123445']));
生成的网址
http://domain.test/getChildren/itm%3An%23_123445
处理
Route::get('getChildren/{url}', function ($url) {
    dd($url); // itm:n#_123445

});

希望对你有帮助

【讨论】:

    【解决方案2】:

    我建议更新您的表架构,为数据库中的每个 uri 创建一个唯一的 id,如果它还没有的话。与其将完整的 uri 作为参数传递,不如传递 id。

    【讨论】:

      【解决方案3】:

      首先,

      如果您使用这种特定格式,浏览器会将# 理解为对页面中锚点的引用——就像这个例子:https://laravel.com/docs/7.x/packages#views

      并且不会将数字传递给后端 - 正如您所提到的,您很可能必须在发送之前对 URL 进行编码

      现在,如果您确定后端可以接收这种格式,我会在中间件中进行 preg_match(如果这种格式是循环的)或直接在控制器中提取数字 id。

      preg_match('/itm:n#_(\d*)/', $uri , $matches);
      $id = matches[0]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-31
        • 1970-01-01
        • 2017-03-24
        • 2010-09-11
        • 1970-01-01
        • 2018-09-06
        • 2011-08-19
        • 1970-01-01
        相关资源
        最近更新 更多