Cómo deserializar un array DC2Type almacenado con Doctrine en su base de datos

post_doctrine_serialize.jpg
Solucionex
13
Sep 21

Ningún motor de base de datos, como MySQL, sabe qué es la serialización de PHP, por lo que no puede hacer esto en este nivel, lo que significa que tendrá que hacerlo sí o sí con PHP. Los campos DC2Type en doctrine se almacenan como un campo con tipo LONGTEXT, ya que MySQL no permite almacenar arrays en la base de datos sino cadenas. Un ejemplo de los datos (cadena) que Doctrine almacena en un registro en su base de datos es el siguiente:

a:15:{
    i:0;s:32:"ROLE_SONATA_USER_ADMIN_USER_EDIT";
    i:1;s:32:"ROLE_SONATA_USER_ADMIN_USER_LIST";
    i:2;s:34:"ROLE_SONATA_USER_ADMIN_USER_CREATE";
    i:3;s:32:"ROLE_SONATA_USER_ADMIN_USER_VIEW";
    i:4;s:34:"ROLE_SONATA_USER_ADMIN_USER_DELETE";
    i:5;s:36:"ROLE_SONATA_USER_ADMIN_USER_OPERATOR";
    i:6;s:34:"ROLE_SONATA_USER_ADMIN_USER_MASTER";
    i:7;s:33:"ROLE_SONATA_USER_ADMIN_GROUP_EDIT";
    i:8;s:33:"ROLE_SONATA_USER_ADMIN_GROUP_LIST";
    i:9;s:35:"ROLE_SONATA_USER_ADMIN_GROUP_CREATE";
    i:10;s:33:"ROLE_SONATA_USER_ADMIN_GROUP_VIEW";
    i:11;s:35:"ROLE_SONATA_USER_ADMIN_GROUP_DELETE";
    i:12;s:37:"ROLE_SONATA_USER_ADMIN_GROUP_OPERATOR";
    i:13;s:35:"ROLE_SONATA_USER_ADMIN_GROUP_MASTER";
    i:14;s:10:"ROLE_ADMIN";
}

Puedes pensar inicialmente que este debe ser un formato complejo y que solo se puede decodificar con Doctrine, sin embargo, esta cadena es solo una matriz serializada normal creada por la función de serialización de PHP . Piense en esto como otra notación para representar información como JSON o XML.

Cómo decodificar (convertir a array PHP)

Si estás trabajando con doctrine y está interactuando con los datos como Entidades, entonces, por lo general, si el tipo de campo ya está especificado en Doctrine, la propiedad getter de la entidad debería devolver un array. Sin embargo, si no está usando Doctrine pero PHP simple, puedes convertir la cadena en una matriz usando la función unserialize de PHP . La función de PHP serializa serializa una estructura de datos en una representación de cadena que es exclusiva de PHP:

$dc2array = serialize(array("HELLO", "YES"));

// Output: string(36) "a:2:{i:0;s:5:"HELLO";i:1;s:3:"YES";}" 
var_dump($dc2array);

y se puede invertir en un objeto PHP usando unserialize:

$dc2array = unserialize('a:15:{i:0;s:32:"ROLE_SONATA_USER_ADMIN_USER_EDIT";i:1;s:32:"ROLE_SONATA_USER_ADMIN_USER_LIST";i:2;s:34:"ROLE_SONATA_USER_ADMIN_USER_CREATE";i:3;s:32:"ROLE_SONATA_USER_ADMIN_USER_VIEW";i:4;s:34:"ROLE_SONATA_USER_ADMIN_USER_DELETE";i:5;s:36:"ROLE_SONATA_USER_ADMIN_USER_OPERATOR";i:6;s:34:"ROLE_SONATA_USER_ADMIN_USER_MASTER";i:7;s:33:"ROLE_SONATA_USER_ADMIN_GROUP_EDIT";i:8;s:33:"ROLE_SONATA_USER_ADMIN_GROUP_LIST";i:9;s:35:"ROLE_SONATA_USER_ADMIN_GROUP_CREATE";i:10;s:33:"ROLE_SONATA_USER_ADMIN_GROUP_VIEW";i:11;s:35:"ROLE_SONATA_USER_ADMIN_GROUP_DELETE";i:12;s:37:"ROLE_SONATA_USER_ADMIN_GROUP_OPERATOR";i:13;s:35:"ROLE_SONATA_USER_ADMIN_GROUP_MASTER";i:14;s:10:"ROLE_ADMIN";}');

var_dump($dc2array);

El método var_dump imprimirá la estructura de la matriz que será la siguiente:

array(15) { 
    [0]=> string(32) "ROLE_SONATA_USER_ADMIN_USER_EDIT" 
    [1]=> string(32) "ROLE_SONATA_USER_ADMIN_USER_LIST" 
    [2]=> string(34) "ROLE_SONATA_USER_ADMIN_USER_CREATE" 
    [3]=> string(32) "ROLE_SONATA_USER_ADMIN_USER_VIEW" 
    [4]=> string(34) "ROLE_SONATA_USER_ADMIN_USER_DELETE" 
    [5]=> string(36) "ROLE_SONATA_USER_ADMIN_USER_OPERATOR" 
    [6]=> string(34) "ROLE_SONATA_USER_ADMIN_USER_MASTER" 
    [7]=> string(33) "ROLE_SONATA_USER_ADMIN_GROUP_EDIT" 
    [8]=> string(33) "ROLE_SONATA_USER_ADMIN_GROUP_LIST" 
    [9]=> string(35) "ROLE_SONATA_USER_ADMIN_GROUP_CREATE" 
    [10]=> string(33) "ROLE_SONATA_USER_ADMIN_GROUP_VIEW" 
    [11]=> string(35) "ROLE_SONATA_USER_ADMIN_GROUP_DELETE" 
    [12]=> string(37) "ROLE_SONATA_USER_ADMIN_GROUP_OPERATOR" 
    [13]=> string(35) "ROLE_SONATA_USER_ADMIN_GROUP_MASTER" 
    [14]=> string(10) "ROLE_ADMIN" 
}

Y eso es todo! De este modo sabemos cómo y porqué vemos este formato en nuestros datos.