【问题标题】:How to pass an array to Laravel Route parameter如何将数组传递给 Laravel Route 参数
【发布时间】:2021-11-04 16:40:51
【问题描述】:

我想将类型为 array 的值传递给我的路由参数,数组可以是任意大小,并且每次都可以使用不同的键值对。

Route::get('/example/{array}', ...

所以如果我有一个这样的数组:

$array = [
  'a' => 'one',
  'b' => 1,
  ...
]

我这样做了,但已经知道它不会起作用,因为看起来我正在将值传递给名为 ab 等的路由参数。

route('route.name', $array)

正如预期的错误所说:

... [缺少参数:数组]

所以我使用了serialize()

route('route.name', serialize($array))

我仍然收到错误消息,例如:

[缺少参数:s:1:"a";i:1;s:1:"b";i:2;]

我错过了什么?我也不明白最后一个错误是什么意思。

【问题讨论】:

    标签: laravel


    【解决方案1】:

    我发现了同样的问题,从我做的测试来看,似乎是php和Laravel不兼容。

    发生的情况是 php serialize()(以及 php json_encode())使用字符«{»。这个字符似乎让 Laravel 路由器感到困惑,所以报错信息。

    我曾尝试使用 php htmlspecialchars(serialize($array))(以及其他组合,如 htmlentities(json_encode($array))),但问题是 «{» 是一个普通字符,因此它们不会对其进行转换(因此继续混淆 Laravel 路由器)。

    我也尝试了Maik Lowrey 的解决方案,但是我没有看到开箱即用的方法来从路由另一侧的序列化参数中恢复数组(urldecode() 什么都不做)。

    最后我使用了以下仅适用于一维数组的丑陋转变(但有效):

    在刀片路由生成中:

    ['arrayParameter' => trim(json_encode($array), '{}')]
    

    在Controller函数中:

    $array = json_decode('{' . $arrayParameter . '}', true);
    

    最好的问候。

    【讨论】:

      【解决方案2】:

      PHP 为此提供了 http_build_query 函数。

      $array = [
        'a' => 'one',
        'b' => 1,
      ];
      
      $query = http_build_query(array('myArray' => $array));
      
      // output: myArray%5Ba%5D=one&myArray%5Bb%5D=1
      

      【讨论】:

        【解决方案3】:

        在 Laravel 中将数据传递给路由时,您应该练习将数据传递到数组中,如下所示:

        路线:

        Route::get('/example/{array}', ...
        

        调用命名路由:

        route('route.name', ['array' => serialize($array)])
        

        我不知道是否需要这种格式,但它 1. 有助于您在传递多个值时更好地格式化您的路线,并且 2 使您的代码更具可读性。

        Laravel Routing Documentation

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-02-24
          • 1970-01-01
          • 2019-05-28
          • 2021-01-17
          • 2015-11-29
          • 2013-06-09
          • 2018-10-08
          • 1970-01-01
          相关资源
          最近更新 更多