botanick/serializer
Laravel/PHP serializer package for converting objects and arrays to structured formats and back. Aims to simplify data transformation with configurable normalization/denormalization for APIs, DTOs, and persistence layers.
Installation
composer require botanick/serializer
Add the service provider to config/app.php:
'providers' => [
Botanick\Serializer\SerializerServiceProvider::class,
],
Basic Usage Register a serializer for a model in a service provider or boot method:
$this->app->bind('serializer.my_model', function () {
return new Botanick\Serializer\Serializers\JsonApiSerializer(MyModel::class);
});
First Use Case: Serializing a Model
use Botanick\Serializer\Facades\Serializer;
$model = MyModel::find(1);
$serialized = Serializer::serialize($model, 'my_model');
config/serializer.php (default configuration)src/Serializers/ (built-in serializer classes)src/Contracts/SerializerInterface.php (core interface)JsonApiSerializer for API responses:
$serializer = new Botanick\Serializer\Serializers\JsonApiSerializer(MyModel::class);
$serializer->serialize($model);
fields() in a custom serializer:
class CustomSerializer extends JsonApiSerializer {
protected function fields() {
return ['id', 'name', 'custom_field'];
}
}
serializeCollection():
$serializer = app('serializer.my_model');
$serialized = $serializer->serializeCollection(MyModel::all());
SerializerResponse helper for API responses:
return SerializerResponse::make($model, 'my_model');
$serializerName = request()->input('serializer', 'default');
$serializer = app("serializer.{$serializerName}");
JsonApiSerializer:
protected function relationships() {
return ['user', 'posts']; // Nested fields
}
public function show(MyModel $model, JsonApiSerializer $serializer) {
return $serializer->serialize($model);
}
public function rules() {
return ['id' => 'required|exists:my_models,id'];
}
public function withValidator($validator) {
$validator->after(function ($validator) {
$serializer = app('serializer.my_model');
$validator->errors()->add('serialized_data', $serializer->serialize($this->input('data')));
});
}
retrieved):
MyModel::retrieved(function ($model) {
$serialized = app('serializer.my_model')->serialize($model);
// Log or cache $serialized
});
$this->app->instance('serializer.my_model', Mockery::mock(JsonApiSerializer::class));
Circular References
protected $includeDepth = 1; in JsonApiSerializer to limit depth.Missing Serializer Bindings
BindingResolutionException.Performance with Large Collections
serializeCollection() with pagination or chunking.Overriding Default Config
config/serializer.php may not reflect in runtime if cached.php artisan config:clear after changes.Type Mismatches
JsonApiSerializer for non-model data:
class ArraySerializer extends JsonApiSerializer {
public function serialize($data) {
return json_encode($data);
}
}
Enable Debug Mode
Add to config/serializer.php:
'debug' => env('APP_DEBUG', false),
Logs serialization steps to storage/logs/serializer.log.
Inspect Serializer Output
Use dd() or dump() to debug fields/relationships:
$serializer = app('serializer.my_model');
dump($serializer->fields(), $serializer->relationships());
Check for Deprecated Methods
SerializerFacade usage.Custom Serializers
Botanick\Serializer\Serializers\BaseSerializer for new formats (e.g., XML):
class XmlSerializer extends BaseSerializer {
public function serialize($data) {
return $this->toXml($data);
}
}
Dynamic Field Selection
$serializer->fields(['id', 'name']); // Override dynamically
Caching Serialized Output
JsonApiSerializer:
protected function serialize($data) {
return Cache::remember("serialized_{$data->id}", now()->addHours(1), function () use ($data) {
return parent::serialize($data);
});
}
GraphQL-like Serialization
include and exclude parameters:
$serializer->include(['user', 'posts'])->exclude(['deleted_at'])->serialize($model);
Validation Integration
use Botanick\Serializer\Validation\JsonSchemaValidator;
$validator = new JsonSchemaValidator($serializedData, $schema);
if ($validator->fails()) {
throw new \InvalidArgumentException($validator->errors());
}
How can I help you explore Laravel packages today?