A Symfony integration for wundii/data-mapper. This library is an extremely fast and strictly typed object mapper built for modern PHP (8.2+). It seamlessly transforms data from formats like CSV, JSON, NEON, XML, YAML, array, and standard objects into well-structured PHP objects.
Ideal for developers who need reliable and efficient data mapping without sacrificing code quality or modern best practices.
- Mapping source data into objects
- Mapping source data with a list of elements into a list of objects
- Initialize object via constructor, properties or methods
- Map nested objects, arrays of objects
- Class mapping for interfaces or other classes
- Custom root element for starting with the source data
- Auto-casting for
floattypes (eu to us decimal separator) - Target alias via Attribute for properties and methods
- Automatic data sorting for constructor parameters
nullbool|?boolint|?intfloat|?floatstring|?stringarrayint[]float[]string[]object[]
object|?objectenum|?enum
optional formats are marked with an asterisk *
arraycsvjsonneon*objectpublic propertypublic gettersmethod toArray()attribute SourceData('...')
xmlyaml*
Require the bundle and its dependencies with composer:
composer require wundii/data-mapper-symfony-bundleInclude the bundle in your bundles.php:
return [
// ...
Wundii\DataMapper\SymfonyBundle\DataMapperBundle::class => ['all' => true],
];Create a Symfony configuration file config/packages/data_mapper.yaml with the command:
bin/console data-mapper:default-configThe following setting options are available
data_mapper:
data_config:
approach: 'CONSTRUCTOR|PROPERTY|SETTER' # ApproachEnum::SETTER
accessible: 'PRIVATE|PUBLIC' # AccessibleEnum::PUBLIC
class_map:
InterfaceOrClassName: 'ClassName', # Class mapping for interfaces or other classes
...: ...<?php
declare(strict_types=1);
namespace App\Controller;
use App\Dto\TestClass;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Wundii\DataMapper\SymfonyBundle\DataMapper;
final class YourController extends AbstractController
{
public function __construct(
private readonly DataMapper $dataMapper,
) {
}
#[Route('/do-something/', name: 'app_do-something')]
public function doSomething(Request $request): Response
{
// Automatic recognition of the format based on the content type of the request
// returns an instance of TestClass or an Exception
$testClass = $this->dataMapper->request($request, TestClass::class);
// or you can use tryRequest to avoid exceptions, null will be returned instead
$testClass = $this->dataMapper->tryRequest($request, TestClass::class);
$this->dataMapper->getMapStatusEnum();
$this->dataMapper->getErrorMessage();
// Do something with $testClass
return $this->json(...);
}
}<?php
declare(strict_types=1);
namespace App\Controller;
use App\Dto\TestClass;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Wundii\DataMapper\DataMapper;
final class YourController extends AbstractController
{
public function __construct(
private readonly DataMapper $dataMapper,
) {
}
#[Route('/do-something/', name: 'app_do-something')]
public function doSomething(Request $request): Response
{
// you can use the native DataMapper methods directly
$testClass = $this->dataMapper->json($request->getContent(), TestClass::class);
// Do something with $testClass
return $this->json(...);
}
}