nilportugues/serializer-eloquent
Eloquent ORM driver for nilportugues/serializer. Serialize Laravel/Eloquent models and their relationships into the Serializer library’s normalized array format, handling common Eloquent edge cases so you can reuse one consistent serialization layer across your app.
Installation:
composer require nilportugues/serializer-eloquent
Ensure nilportugues/serializer is also installed (required dependency).
Register the Driver:
In your AppServiceProvider or a dedicated config file:
use NilPortugues\Serializer\Serializer;
use NilPortugues\Serializer\Driver\EloquentDriver;
public function boot()
{
$serializer = new Serializer();
$serializer->addDriver(new EloquentDriver());
$this->app->singleton(Serializer::class, function () use ($serializer) {
return $serializer;
});
}
First Use Case: Serialize an Eloquent model to JSON:
use NilPortugues\Serializer\Serializer;
$user = User::find(1);
$serializer = app(Serializer::class);
$json = $serializer->serialize($user, 'json');
Basic Serialization:
// JSON
$serializer->serialize($model, 'json');
// JSON:API
$serializer->serialize($model, 'jsonapi');
// HAL+JSON
$serializer->serialize($model, 'hal');
Customizing Output:
$serializer->setExcludedAttributes(['password', 'api_token']);
$serializer->setIncludedRelations(['posts', 'comments']);
Nested Serialization:
$post = Post::with('author.comments')->find(1);
$serializer->serialize($post, 'jsonapi'); // Nested relations included
API Resource Integration:
Use with Laravel's JsonResource for hybrid workflows:
$resource = new UserResource($user);
$serializer->serialize($resource, 'json');
Middleware for API Responses:
// app/Http/Middleware/SerializeResponse.php
public function handle($request, Closure $next)
{
$response = $next($request);
if ($response->isJson()) {
$data = $response->getData();
$serialized = app(Serializer::class)->serialize($data, 'jsonapi');
return response()->json($serialized, $response->status());
}
return $response;
}
Dynamic Format Selection:
$format = request()->header('Accept') === 'application/vnd.api+json' ? 'jsonapi' : 'json';
$serializer->serialize($model, $format);
Caching Serialized Output:
$cacheKey = 'user:'.$user->id.':jsonapi';
$serialized = cache($cacheKey, function() use ($user) {
return app(Serializer::class)->serialize($user, 'jsonapi');
}, now()->addHours(1));
Outdated Dependencies:
append, hidden, visible arrays in Laravel 8+).Relation Handling:
// Fix: Ensure relations are loaded
$model->load(['relation1', 'relation1.relation2']);
User hasMany Post, Post belongsTo User) require explicit exclusion:
$serializer->setExcludedAttributes(['posts.user']); // Break cycles
JSON:API Compliance:
jsonapi driver may not fully adhere to JSON:API spec (e.g., links, meta fields). Validate output with tools like jsonapi-test.Performance:
User::all()) can be memory-intensive. Use pagination or chunking:
User::cursor()->each(function ($user) {
$serializer->serialize($user, 'json');
});
$driver = $serializer->getDriver('eloquent');
dump($driver->getRules()); // View applied rules
$serializer->setDebug(true); // Logs serialization steps
timestamps vs. $dates).Custom Drivers:
Extend EloquentDriver to support additional formats or logic:
class CustomEloquentDriver extends EloquentDriver
{
protected function getDefaultFormat()
{
return 'custom';
}
public function serializeToCustom($model)
{
// Custom logic
}
}
Dynamic Attribute Mapping:
Use getAttributes() to transform attributes on-the-fly:
$serializer->setAttributeTransformer(function ($model, $attribute) {
return strtoupper($attribute); // Example: Convert all attributes to uppercase
});
Event Hooks:
Listen to serialization events (if supported in newer versions of nilportugues/serializer):
$serializer->on('serializing', function ($model, $format) {
// Pre-serialization logic
});
Fallback for Missing Attributes: Handle cases where attributes are missing in the model:
$serializer->setDefaultValueForMissingAttributes(null); // or a default value
EloquentDriver is registered before other drivers to avoid conflicts.serialize() method uses the first matching driver. Explicitly specify formats to avoid ambiguity:
$serializer->serialize($model, 'jsonapi'); // Not 'json'
How can I help you explore Laravel packages today?