A partir de Magento 2.2 ya no podemos serializar datos directamente usando el comando de PHP serialize() y unserialized().
Magento2 no lo permite porque puede provocar problemas de seguridad en la aplicación.
As per Magento 2.2
Release Note Security enhancements
In general, we’ve removed serialize/unserialize from most the code to improve protection against remote code execution attacks. We’ve enhanced protection of code where use of object serialization or unserialization was unavoidable. Additionally, we’ve increased our use of output escaping to protect against cross-site scripting (XSS) attacks.
Las versión de Magento 2.2> pone a nuestra disposición la Librería Serialize. Veamos su funcionamiento:
- Esta librería nos permite de una forma segura serializar y deserializar cadenas, números, datos booleanos y arrays.
- La librería Serialize nos provee tanto la interfaz Magento\Framework\Serialize\SerializerInterface, como las implementaciones json y serialize para serializar o deserializar datos.
- El propósito de la serialización es convertir datos en una cadena usando el método serialize() para poder guardarla en la base de datos, en la cache o para pasársela a otra aplicación.
- La deserialización de los datos corre a cargo del método unserialize() que convierte la cadena serializada en datos que podamos leer.
Es importante saber que los datos serializados serán guardados de una u otra manera «dependiendo de la versión de Magento» que estemos ejecutando.
- Magento 2.0.x trabaja con la función PHP serialize por defecto.
- Magento 2.2.x trabaja con la función PHP json por defecto (json_encode, json_decode)
En el caso que querramos utilizar la clase json:
1 2 3 4 5 6 7 8 9 10 |
<?php use Magento\Framework\Serialize\Serializer\Json; private $_jsonHelper; public function __construct( Json $jsonHelper ) { $this->_jsonHelper = $jsonHelper; } |
1 2 |
$this->_jsonHelper->serialize($data) $this->_jsonHelper->unserialize($data) |
Para usar la clase serialize:
1 2 3 4 5 6 7 8 9 10 |
<?php use Magento\Framework\Serialize\SerializerInterface; private $_serializer; public function __construct( SerializerInterface $serializer ) { $this->_serializer = $serializer; } |
1 2 |
$this->_serializer->serialize($data) $this->_serializer->unserialize($data) |