apie/serializer
Apie Serializer converts domain objects to stored/customer-facing data and back. Similar to Symfony Serializer but uses ApieSerializerContext for recursive calls. Supports normalize/denormalize, encoding/decoding, and easy extension via custom Normalizer and Denormalizer interfaces.
Installation
composer require apie/serializer
Add to composer.json if using a monorepo or custom package structure.
Basic Usage
use Apie\Serializer\Serializer;
$serializer = new Serializer();
$data = ['name' => 'John', 'age' => 30];
$json = $serializer->serialize($data);
$decoded = $serializer->deserialize($json, 'array');
Laravel Integration
Bind the serializer to the container in AppServiceProvider:
$this->app->singleton(Serializer::class, function ($app) {
return new Serializer();
});
Inject via constructor:
public function __construct(private Serializer $serializer) {}
First Use Case Convert Eloquent models to JSON with custom rules:
$user = User::find(1);
$serialized = $serializer->serialize($user, [
'name' => ['property' => 'full_name'],
'email' => ['property' => 'email_address'],
]);
Model Serialization
$serializer->serialize($model, [
'id' => ['property' => 'uuid'],
'created_at' => ['format' => 'Y-m-d'],
]);
Nested Objects
$serializer->serialize($order, [
'items' => [
'type' => 'collection',
'items' => [
'product_id' => ['property' => 'product.uuid'],
'quantity' => ['property' => 'quantity'],
],
],
]);
Deserialization
$data = $serializer->deserialize($json, 'array', [
'user' => ['type' => 'object', 'properties' => [...]],
]);
API Responses
return response()->json($serializer->serialize($data, $rules), 200, [], JSON_PRETTY_PRINT);
deserialize() to validate and transform incoming JSON:
$validated = $serializer->deserialize($request->json(), 'array', $rules);
JsonResource to use the serializer for consistent output:
public function toArray($request)
{
return $this->serializer->serialize($this->resource, $this->rules);
}
$cacheKey = 'user:'.$user->id;
$serialized = Cache::remember($cacheKey, now()->addHours(1), function () use ($user) {
return $serializer->serialize($user);
});
Circular References
User->orders->user).['ignore_circular' => true] or implement a custom resolver.Type Mismatches
int) throws exceptions.try-catch:
try {
$data = $serializer->deserialize($json, 'array');
} catch (SerializationException $e) {
return response()->json(['error' => 'Invalid data'], 400);
}
Default Values
null. Use default in rules:
['age' => ['default' => 18]]
Performance
['max_depth' => 5] to limit recursion.Enable Verbose Errors
$serializer = new Serializer(['verbose_errors' => true]);
Logs detailed errors for invalid rules or missing properties.
Inspect Rules Validate rules before serialization:
$serializer->validateRules($data, $rules);
Custom Serializers
Implement Apie\Serializer\Contracts\SerializerInterface for domain-specific logic:
class CustomSerializer implements SerializerInterface {
public function serialize($data, array $rules = []): string {
// Custom logic
}
}
Rule Extensions Add custom rule types:
$serializer->addRuleType('slug', function ($value) {
return Str::slug($value);
});
Usage:
['slug' => ['type' => 'slug', 'property' => 'name']]
Event Hooks
Listen for serializing and deserializing events (if supported in future versions):
$serializer->on('serializing', function ($data, $rules) {
// Pre-process data
});
$serializer = new Serializer([
'default_rules' => ['id' => ['property' => 'uuid']],
]);
['format' => 'Y-m-d H:i:s'] for custom date formats. Default is ISO-8601.How can I help you explore Laravel packages today?