laminas/laminas-serializer
Laminas Serializer provides a flexible way to serialize and unserialize PHP data using multiple adapters (e.g., PHP serialize, JSON, Base64). Includes configuration options, adapter plugins, and error handling for safe, consistent data transformation.
Installation:
composer require laminas/laminas-serializer
For Laravel, use laminas/laminas-serializer with a DI container like laminas/laminas-servicemanager or php-di.
First Use Case: Serialize/deserialize a PHP object to/from JSON (default adapter):
use Laminas\Serializer\Adapter\Json;
use Laminas\Serializer\Adapter\AdapterInterface;
$serializer = new Json();
$data = ['name' => 'John', 'age' => 30];
// Serialize to JSON string
$jsonString = $serializer->serialize($data);
// Deserialize back to PHP array
$restoredData = $serializer->unserialize($jsonString);
Laravel Integration:
Register the service in config/app.php or use a container binding:
$container->bind(AdapterInterface::class, function ($container) {
return new Json();
});
Adapter-Based Serialization:
Json, Xml, PhpSerialize, Igbinary) or extend AdapterInterface for custom formats.$jsonAdapter = new Json();
$xmlAdapter = new Xml();
$serializedJson = $jsonAdapter->serialize($data);
$serializedXml = $xmlAdapter->serialize($data);
Dependency Injection:
$container->bind('serializer.json', function () {
return new Json(['pretty_print' => true]);
});
public function __construct(private AdapterInterface $serializer) {}
Custom Serialization Logic:
AdapterInterface for custom formats (e.g., Protocol Buffers):
class ProtobufAdapter implements AdapterInterface {
public function serialize($data): string { /* ... */ }
public function unserialize(string $data): mixed { /* ... */ }
}
Configuration-Driven Serialization:
GenericSerializerFactory to configure default adapters:
$factory = new GenericSerializerFactory();
$serializer = $factory->createService([
'default_adapter' => Json::class,
'options' => ['pretty_print' => true]
]);
Service Providers: Register adapters in a Laravel service provider:
public function register() {
$this->app->singleton(AdapterInterface::class, function () {
return new Json();
});
}
API Responses: Serialize Eloquent models to JSON for API responses:
public function show(User $user) {
$serializer = app(AdapterInterface::class);
return response()->json($serializer->serialize($user->toArray()));
}
Caching:
Use Igbinary for compact binary serialization in cache:
$cacheAdapter = new Igbinary();
$cachedData = $cacheAdapter->unserialize(cache('key'));
Form Requests: Deserialize JSON payloads in request handling:
public function store(Request $request) {
$serializer = app(AdapterInterface::class);
$data = $serializer->unserialize($request->getContent());
// Process $data
}
Type Safety:
unserialize() is unsafe. Use Json or Igbinary for secure deserialization.PhpSerialize for untrusted input:
// UNSAFE: Use only with trusted data
$phpSerializer = new PhpSerialize();
$data = $phpSerializer->unserialize($_POST['serialized_data']);
Adapter Limitations:
Xml adapter may not handle all PHP types (e.g., DateTimeImmutable).PhpSerialize has compatibility issues with closures or resources.Laravel Container Conflicts:
AdapterInterface exist in Laravel's container.Deprecated Methods:
Laminas\Serializer\Serializer (deprecated in v2.16.0). Use AdapterInterface directly.Validation:
if (!Json::isValid($jsonString)) {
throw new \InvalidArgumentException('Invalid JSON');
}
Error Handling:
try {
$data = $serializer->unserialize($string);
} catch (\RuntimeException $e) {
Log::error('Deserialization failed: ' . $e->getMessage());
}
Logging:
$serializer->setOptions(['logger' => $logger]);
Custom Adapters:
AdapterInterface for new formats (e.g., Avro, MessagePack):
class AvroAdapter implements AdapterInterface {
public function serialize($data): string {
// Custom Avro serialization logic
}
public function unserialize(string $data): mixed {
// Custom Avro deserialization logic
}
}
Middleware for API:
public function handle($request, Closure $next) {
$data = app(AdapterInterface::class)->unserialize($request->getContent());
$request->merge(['data' => $data]);
return $next($request);
}
Event-Based Serialization:
User::saved(function ($user) {
$serialized = app(AdapterInterface::class)->serialize($user->toArray());
// Store $serialized
});
Testing:
$mockAdapter = Mockery::mock(AdapterInterface::class);
$mockAdapter->shouldReceive('serialize')->andReturn('{"test":1}');
$this->app->instance(AdapterInterface::class, $mockAdapter);
Options Handling:
$jsonAdapter = new Json(['pretty_print' => true, 'date_format' => 'c']);
Default Adapter:
config/services.php:
'serializer' => [
'default' => Laminas\Serializer\Adapter\Json::class,
'options' => ['pretty_print' => false],
],
Performance:
Igbinary over Json for speed:
$fastAdapter = new Igbinary();
How can I help you explore Laravel packages today?