SerializesModels.php
TLDR
This file provides the SerializesModels
trait, which is used to serialize and unserialize model instances. It contains methods for preparing the instance values for serialization and restoring the model after serialization.
Methods
__serialize
This method prepares the instance values for serialization. It uses reflection to get the class, properties, and class-level attributes of the object. It loops over the properties, checks if they are static or uninitialized, and then gets the serialized property value. It returns an array of the serialized values.
__unserialize
This method restores the model after serialization. It uses reflection to get the properties of the object. It loops over the properties, checks if they are static, and then sets the restored property value.
getPropertyValue
This protected method is used to get the value of a given property using reflection.
<?php
namespace Illuminate\Queue;
use Illuminate\Queue\Attributes\WithoutRelations;
use ReflectionClass;
use ReflectionProperty;
trait SerializesModels
{
use SerializesAndRestoresModelIdentifiers;
/**
* Prepare the instance values for serialization.
*
* @return array
*/
public function __serialize()
{
$values = [];
$reflectionClass = new ReflectionClass($this);
[$class, $properties, $classLevelWithoutRelations] = [
get_class($this),
$reflectionClass->getProperties(),
! empty($reflectionClass->getAttributes(WithoutRelations::class)),
];
foreach ($properties as $property) {
if ($property->isStatic()) {
continue;
}
if (! $property->isInitialized($this)) {
continue;
}
$value = $this->getPropertyValue($property);
if ($property->hasDefaultValue() && $value === $property->getDefaultValue()) {
continue;
}
$name = $property->getName();
if ($property->isPrivate()) {
$name = "\0{$class}\0{$name}";
} elseif ($property->isProtected()) {
$name = "\0*\0{$name}";
}
$values[$name] = $this->getSerializedPropertyValue(
$value,
! $classLevelWithoutRelations &&
empty($property->getAttributes(WithoutRelations::class))
);
}
return $values;
}
/**
* Restore the model after serialization.
*
* @param array $values
* @return void
*/
public function __unserialize(array $values)
{
$properties = (new ReflectionClass($this))->getProperties();
$class = get_class($this);
foreach ($properties as $property) {
if ($property->isStatic()) {
continue;
}
$name = $property->getName();
if ($property->isPrivate()) {
$name = "\0{$class}\0{$name}";
} elseif ($property->isProtected()) {
$name = "\0*\0{$name}";
}
if (! array_key_exists($name, $values)) {
continue;
}
$property->setValue(
$this, $this->getRestoredPropertyValue($values[$name])
);
}
}
/**
* Get the property value for the given property.
*
* @param \ReflectionProperty $property
* @return mixed
*/
protected function getPropertyValue(ReflectionProperty $property)
{
return $property->getValue($this);
}
}