This package, SerializerBundle, is a Laravel-friendly wrapper for Symfony's Serializer component, enabling seamless JSON/XML serialization/deserialization. To start:
composer require anzusystems/serializer-bundlephp artisan vendor:publish --provider="AnzuSystems\SerializerBundle\SerializerServiceProvider"config/app.php under providers.\AnzuSystems\SerializerBundle\Facades\Serializer for basic operations:
$serialized = \Serializer::serialize($object, 'json');
$object = \Serializer::deserialize($serialized, 'App\Model', 'json');
First use case: Convert Eloquent models to/from JSON for APIs or storage.Model Serialization:
$user = User::find(1);
$serialized = \Serializer::serialize($user, 'json', [
'groups' => ['user:public'] // Uses Symfony's @Groups annotations
]);
@Groups annotations in models for granular control:
class User {
/** @Groups({"user:public"}) */
public $name;
}
Request/Response Handling:
use AnzuSystems\SerializerBundle\Serializer;
return response()->json(Serializer::serialize($data, 'json'));
Deserialization:
$data = \Serializer::deserialize($json, 'App\Dto\UserDto', 'json');
Custom Formats:
SerializerInterface.Symfony\Component\HttpFoundation\Response for consistent serialization.$dto = \Serializer::deserialize($request->json(), UserDto::class, 'json');
$validator = Validator::make($dto->toArray(), UserDto::$rules);
$cacheKey = 'user:'.$user->id;
$serialized = Cache::remember($cacheKey, now()->addHours(1), fn() =>
\Serializer::serialize($user, 'json')
);
symfony/serializer to ^6.0 if not already done:
composer require symfony/serializer:^6.0
Annotation Processing:
doctrine/annotations for PHP annotations).autoload-dev includes annotations in composer.json:
"autoload-dev": {
"psr-4": { "App\\": "app/" },
"classmap": ["vendor/doctrine/annotations/lib/DocBlock"]
}
Circular References:
User->posts->author->user) throws errors.max_depth option:
\Serializer::serialize($user, 'json', ['max_depth' => 2]);
Performance:
$serializer = \Serializer::getSerializer();
$serialized = $serializer->serialize($collection->take(100), 'json');
Custom Normalizers:
Symfony\Component\Serializer\Normalizer\NormalizerInterface.'serializer' => [
'normalizers' => [
App\Normalizer\CustomNormalizer::class,
],
],
'debug' => true in config to log serialization issues.json_last_error() or simplexml_load_string() to validate output:
$serialized = \Serializer::serialize($object, 'json');
if (json_last_error() !== JSON_ERROR_NONE) {
throw new \RuntimeException('Serialization failed');
}
@Groups annotations are applied:
$metadata = \Serializer::getMetadataFactory()->getMetadataFor(App\User::class);
print_r($metadata->getGroups());
Add New Formats:
Symfony\Component\Serializer\Encoder\EncoderInterface for custom formats (e.g., MessagePack).'serializer' => [
'encoders' => [
App\Encoder\MessagePackEncoder::class,
],
],
Event Listeners:
serializer.normalize or serializer.denormalize events for pre/post-processing:
\Serializer::addListener('serializer.normalize', function ($event) {
$event->getObject()->setHiddenAttribute(true);
});
Laravel Service Providers:
$this->app->bind(\SerializerInterface::class, function () {
return new App\CustomSerializer();
});
How can I help you explore Laravel packages today?