jade
jade

Reputation: 811

How to pass an array to Laravel Route parameter

I wanted to pass a value of typed array to my route parameter, the array could be in any size and a different key-value pairs each time.

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

So if I have an array like this:

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

I did this but knew already it ain't gonna work because it looks like I'm passing values to my route parameters named a, b, etc.

route('route.name', $array)

As expected the error says:

... [Missing parameter: array]

So I used the serialize().

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

I'm still getting an error, something like:

[Missing parameter: s:1:"a";i:1;s:1:"b";i:2;]

What am I missing ? I also don't understand what the last error says.

Upvotes: 1

Views: 4582

Answers (3)

Alberto Suárez
Alberto Suárez

Reputation: 117

I found the same problem, and from the tests I did, it seems to be an incompatibility between php and Laravel.

What happens is that php serialize() (and also php json_encode()) use the character «{». This character seems to confuse Laravel router, so the error message.

I have tried to use php htmlspecialchars(serialize($array)) (and other combinations like htmlentities(json_encode($array))) but the problem is that «{» is a normal character so they do not transform it (so continues confusing the Laravel router).

I also tried the solution of Maik Lowrey, but then I do not see an out of the box method to recover the array from the serialized parameter on the other side of the route (urldecode() does nothing).

At last I have used the following ugly turnaround that only works for one-dimension arrays (but works):

In the blade route generation:

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

In the Controller function:

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

Best regards.

Upvotes: 1

Garrett Massey
Garrett Massey

Reputation: 109

When passing data to a route in Laravel you should make a practice of passing that data in an array like so:

Route:

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

Calling the named route:

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

I don't know if this formatting is required, but it 1. helps you to better format your routes when passing multiple values, and 2, makes your code more readable.

Laravel Routing Documentation

Upvotes: 1

Maik Lowrey
Maik Lowrey

Reputation: 17586

PHP have for this the http_build_query function.

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

$query = http_build_query(array('myArray' => $array));

// output: myArray%5Ba%5D=one&myArray%5Bb%5D=1

Upvotes: 2

Related Questions