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 projects, use laminas/laminas-serializer with a DI container (e.g., Laravel's built-in container or Laminas Service Manager).
Basic Usage:
use Laminas\Serializer\Adapter\AdapterInterface;
use Laminas\Serializer\Adapter\PhpSerialize;
// Register the adapter (Laravel example)
$container->bind(AdapterInterface::class, function ($container) {
return new PhpSerialize();
});
// Usage
$serializer = $container->make(AdapterInterface::class);
$data = ['key' => 'value', 'nested' => ['foo' => 'bar']];
// Serialize
$serialized = $serializer->serialize($data);
// Deserialize
$deserialized = $serializer->unserialize($serialized);
First Use Case:
Adapter-Based Serialization:
AdapterInterface for type-agnostic serialization. Supported adapters:
PhpSerialize (default, PHP’s native serialize()).Json (for JSON strings).Xml (for XML strings).IgBinary (for binary data).$jsonAdapter = new \Laminas\Serializer\Adapter\Json();
$serialized = $jsonAdapter->serialize(['data' => 123]);
Dependency Injection:
$container->bind(AdapterInterface::class, function () {
return new \Laminas\Serializer\Adapter\IgBinary();
});
Custom Serialization:
AdapterInterface for domain-specific needs:
class CustomAdapter implements AdapterInterface {
public function serialize($data): string {
return json_encode($data, JSON_PRETTY_PRINT);
}
public function unserialize(string $serialized): mixed {
return json_decode($serialized, true);
}
}
Error Handling:
try-catch for malformed data:
try {
$data = $serializer->unserialize($corruptData);
} catch (\RuntimeException $e) {
log::error("Deserialization failed: " . $e->getMessage());
}
$serializer = app(AdapterInterface::class);
Cache::put('key', $serializer->serialize($data), $minutes);
$data = $serializer->unserialize(Cache::get('key'));
return response()->json($serializer->serialize($resource));
$job->handle($serializer->unserialize($job->payload));
Type Safety:
unserialize() may return false or throw exceptions for invalid data. Always validate:
if ($result = $serializer->unserialize($data)) {
// Safe to use
}
serialize() is not secure for untrusted input (risk of object injection). Use Json or IgBinary for APIs.Adapter Limitations:
PhpSerialize handles PHP-specific types (e.g., DateTime, SplObjectStorage) but fails for non-PHP data.Json/Xml lose type information (e.g., DateTime becomes a string).Performance:
IgBinary is faster than Json for large data but less human-readable.Deprecations:
Laminas\Serializer\Serializer (v2) is removed in v3. Use AdapterInterface directly.MsgPack, Wddx) are dropped in v3.var_dump($serializer->unserialize($data)) to check for partial deserialization.Json/Xml, validate the string first:
json_decode($data); // Returns null on failure
memory_limit. Stream data or chunk serialization:
$serializer->serialize($data, ['stream' => true]);
Configuration:
config/services.php:
'serializer' => [
'adapter' => \Laminas\Serializer\Adapter\IgBinary::class,
],
GenericSerializerFactory to customize options (e.g., Json pretty-printing).Testing:
AdapterInterface in unit tests:
$mock = $this->createMock(AdapterInterface::class);
$mock->method('serialize')->willReturn('mocked');
null, empty arrays, circular references.Security:
unserialize(). For APIs, prefer Json:
$data = json_decode($request->input(), true);
IgBinary for binary data (e.g., file uploads) to avoid PHP object injection.Extending:
Protobuf):
class ProtobufAdapter implements AdapterInterface {
public function serialize($data): string {
return \Protobuf::encode($data);
}
public function unserialize(string $serialized): mixed {
return \Protobuf::decode($serialized);
}
}
$container->bind(AdapterInterface::class, ProtobufAdapter::class);
Laravel-Specific:
AppServiceProvider:
public function register() {
$this->app->bind(AdapterInterface::class, function () {
return new \Laminas\Serializer\Adapter\Json();
});
}
$serialized = app(AdapterInterface::class)->serialize($responseData);
return response($serialized, 200, ['Content-Type' => 'application/json']);
How can I help you explore Laravel packages today?