dlin/array-converter-bundle
Installation
composer require dlin/array-converter-bundle
Add to config/bundles.php:
return [
// ...
Dlin\ArrayConverterBundle\DlinArrayConverterBundle::class => ['all' => true],
];
First Use Case Annotate a Doctrine entity or custom object:
use Dlin\ArrayConverterBundle\Annotation\ArrayConverter;
/**
* @ArrayConverter(
* properties={
* "id": "getId",
* "name": "getName",
* "customKey": "getCustomValue"
* },
* exclude={"sensitiveField"}
* )
*/
class User {}
Convert to Array Use the converter service in a controller:
use Dlin\ArrayConverterBundle\Converter\ArrayConverter;
public function showAction(User $user, ArrayConverter $converter)
{
$array = $converter->toArray($user);
return new JsonResponse($array);
}
Serialization
$converter->toArray($entity, ['group' => 'api']);
/**
* @ArrayConverter(
* groups={"api", "admin"},
* properties={
* "id": "getId",
* "name": {"getName", "api"}
* }
* )
*/
Deserialization
$user = new User();
$converter->fromArray($request->request->all(), $user);
Custom Converters
class CustomConverter extends ArrayConverter
{
public function toArray($object, array $options = [])
{
$array = parent::toArray($object, $options);
$array['customField'] = $this->getCustomValue($object);
return $array;
}
}
Integration with Controllers
public function updateAction(Request $request, User $user, ArrayConverter $converter)
{
$converter->fromArray($request->request->all(), $user);
$em->persist($user);
$em->flush();
return $this->showAction($user, $converter);
}
Response Wrapping
$data = $converter->toArray($entity);
return new JsonResponse([
'data' => $data,
'meta' => ['timestamp' => now()->toIso8601String()]
]);
fromArray() to populate form data before validation.$cacheKey = md5(serialize($entity) . serialize($options));
$array = $cache->get($cacheKey, function() use ($entity, $converter, $options) {
return $converter->toArray($entity, $options);
});
Annotation Parsing
doctrine/annotations is installed and configured in composer.json:
"require": {
"doctrine/annotations": "^1.0"
}
php bin/console cache:clear
Circular References
User ↔ Post with bidirectional relations). Use exclude or custom logic to break cycles:
/**
* @ArrayConverter(exclude={"posts"})
*/
class User {}
Type Safety
BadMethodCallException.Legacy Code
Performance
Annotation Errors
@ArrayConverter without spaces:
// Correct
@ArrayConverter(properties={"id": "getId"})
// Incorrect (throws error)
@ArrayConverter (properties = {"id": "getId"})
Converter Not Found
config/bundles.php and dependencies are installed.Property Mapping Issues
public and follow naming conventions (e.g., getName() for property name).var_dump() to inspect the converter’s output:
$array = $converter->toArray($object);
var_dump($array);
Custom Annotations
use Dlin\ArrayConverterBundle\Annotation\ArrayConverterParser;
class CustomParser extends ArrayConverterParser
{
public function parse($method, $annotation)
{
// Custom parsing logic
return parent::parse($method, $annotation);
}
}
services.yaml:
services:
App\CustomParser:
tags: [dlin_array_converter.parser]
Event Listeners
// Hypothetical event listener
$converter->addListener('preConvert', function($object, &$options) {
$options['customFlag'] = true;
});
Override Default Converter
services:
dlin_array_converter.converter:
class: App\CustomConverter
arguments: ['@annotation_reader']
Add Custom Data Transformers
Dlin\ArrayConverterBundle\Converter\DataTransformerInterface:
class DateTransformer implements DataTransformerInterface
{
public function transform($data)
{
return $data instanceof \DateTime ? $data->format('Y-m-d') : $data;
}
}
Annotation Reader
AnnotationReader. Ensure it’s configured in config/packages/doctrine.yaml:
doctrine:
orm:
annotations:
listener: true
Service Autowiring
services:
Dlin\ArrayConverterBundle\Converter\ArrayConverter:
arguments: ['@annotation_reader']
Group-Based Filtering
@ArrayConverter(groups={"api", "public"})
Exclusion Logic
exclude takes precedence over properties. Excluded fields are omitted even if listed in properties.Use for DTOs
$dto = new UserDto();
$converter->toArray($entity, $dto);
Combine with Serializer
symfony/serializer for complex types (e.g., nested objects):
$serializer = $container->get('serializer');
$data = $serializer->serialize($object, 'json');
API Documentation
// Pseudocode: Extract @ArrayConverter metadata for API docs
$reflection = new \ReflectionClass($entity);
$annotation = $reflection->getAnnotation('ArrayConverter');
Testing
$converter = $this->createMock(ArrayConverter::class);
$converter->method('toArray')->
How can I help you explore Laravel packages today?