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
float
types (eu to us decimal separator) - Target alias via Attribute for properties and methods
- Automatic data sorting for constructor parameters
null
bool
|?bool
int
|?int
float
|?float
string
|?string
array
int[]
float[]
string[]
object[]
object
|?object
enum
|?enum
optional formats are marked with an asterisk *
array
csv
json
neon
*object
public property
public getters
method toArray()
attribute SourceData('...')
xml
yaml
*
Require the bundle and its dependencies with composer:
composer require wundii/data-mapper-symfony-bundle
Include 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-config
The 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(...);
}
}