danilovl/object-to-array-transform-bundle
Symfony bundle that converts objects to arrays using configurable field mappings. Define fields in parameters and provide corresponding getters on your entities. Works with PHP 8.5+ and Symfony 8+.
Pros:
ParameterBag and bundle architecture. Laravel’s service container and configuration system (e.g., config/, app/Providers) would require significant adaptation to replicate its functionality.bind(), when()) may not align cleanly with static field mappings.toArray(), append(), hidden()) for similar use cases.Cons:
ParameterBag with Laravel’s config() or a custom service provider.ObjectToArrayTransformServiceInterface) to Laravel’s container.bundles.php and services.yaml to Laravel’s config/api_fields.php and service bindings.Arrayable interface and packages like spatie/laravel-arrayable already solve object-to-array transformations with less friction.Arrayable supports via append()/hidden() or middleware.User → Posts → Comments → Replies.Arrayable throws exceptions or returns null by default, which may be preferable.Transformer trait) be simpler?Arrayable suffice?spatie/laravel-arrayable, fractal) already addressing this need?Illuminate\Support\Collection::make()->toArray() or json_encode() with custom logic.spatie/data-transfer-object).ParameterBundle and Symfony’s ParameterBag, which have no Laravel equivalents.services.yaml vs. Laravel’s config/.getX() methods aligns with Laravel’s Eloquent conventions.Arrayable and append() can handle similar use cases without external dependencies.To adapt this bundle for Laravel, the following steps would be required:
ParameterBag:
config('api_fields') or a custom service to load field mappings.// config/api_fields.php
return [
'default' => [
'App\Models\Shop' => ['id', 'name', 'city'],
'App\Models\City' => ['id', 'name', 'latitude', 'longitude'],
],
];
ObjectToArrayTransformer service that reads from config('api_fields').// app/Providers/ObjectToArrayTransformerServiceProvider.php
public function register()
{
$this->app->singleton(ObjectToArrayTransformServiceInterface::class, function ($app) {
return new LaravelObjectToArrayTransformer(config('api_fields'));
});
}
ReflectionClass and Collection instead of Symfony’s tools.class LaravelObjectToArrayTransformer implements ObjectToArrayTransformServiceInterface
{
public function transform(string $configKey, object $object): array
{
$fields = config("api_fields.{$configKey}." . class_basename($object));
// ... custom transformation logic
}
}
public function __construct(private ObjectToArrayTransformServiceInterface $transformer) {}
$shops = Shop::all();
$transformed = $shops->map(fn ($shop) => $this->transformer->transform('default', $shop));
getX() conventions.getX() methods or additional logic to handle non-Eloquent objects.Appends and Hidden attributes may conflict with the bundle’s field mappings. Prioritize one system over the other.Carbon instances can be formatted using toDateTimeString() or custom accessors, but the bundle’s date_format parameter would need adaptation.User → Posts → Comments).Arrayable and json_encode().spatie/laravel-arrayable or custom DTOs.ReflectionClass deprecations).Arrayable or spatie/laravel-arrayable are actively maintained and require no custom upkeep.config/api_fields.php).Arrayable.Collection methods (e.g., map())How can I help you explore Laravel packages today?