如何将序列化数组传递给 Symfony2 命令


How to pass a serialized array to Symfony2 Command

我用一个参数创建了一个symfony2命令。此参数是序列化($array) 函数的结果。

但是,在命令中,我无法反序列化()收到的参数,我总是收到一个错误:

Notice: unserialize(): Error at offset 5 of 48 bytes in ...

这是我要发送到命令的数组的示例:

$array = array('key1' => '$value1', 'key2' => '$value2')

当我序列化数组(序列化($array))时,结果如下:

a:2:{s:4:"key1";s:7:"$value1";s:4:"key2";s:7:"$value2";} 

我在想:也许问题是由于字符串中的双引号(记住,是作为参数发送到命令),然后,我应用 addslashes 函数:

addslashes(serialize($array)) 

结果如下:

a:2:{s:4:'"key1'";s:7:'"$value1'";s:4:'"key2'";s:7:'"$value2'";}

但是当我尝试在命令 execute() 函数中反序列化字符串时,我仍然收到相同的错误。

知道吗?

已解决!!问题出在操作系统命令行和双引号上。有一种方法可以序列化数组并避免在命令中使用双引号作为参数:编码 base64。

解决方案是对序列化数组进行编码:

$serialized = serialize(array('key1' => 'value1', 'key2' => 'value2'));
//$serialized => a:2:{s:4:"key1";s:6:"value1";s:4:"key2";s:6:"value2";}
$base64 = base64_encode($serialize);
//$base64 => YToyOntzOjQ6ImtleTEiO3M6NjoidmFsdWUxIjtzOjQ6ImtleTIiO3M6NjoidmFsdWUyIjt9 

如您所见,$base 64 中没有引号(这是 base64_encode() 的目标之一)然后,您可以使用base64_decode轻松解码字符串

$serialized = base64_decode($base64);
//$serialized => a:2:{s:4:"key1";s:6:"value1";s:4:"key2";s:6:"value2";}
$array = unserialize($serialized);
//$array => array('key1' => 'value1', 'key2' => 'value2')

我希望这对某人有所帮助