Symfony bundle integration for php-collective/dto.
composer require php-collective/symfony-dtoThe bundle will be auto-configured if you're using Symfony Flex.
If not using Flex, add to config/bundles.php:
return [
// ...
PhpCollective\SymfonyDto\PhpCollectiveDtoBundle::class => ['all' => true],
];Create config/packages/php_collective_dto.yaml:
php_collective_dto:
config_path: config/ # Path to DTO config files (relative to project root)
output_path: src/Dto/ # Path for generated DTOs
namespace: App\Dto # Namespace for generated DTOs
typescript_output_path: assets/types # TypeScript output
jsonschema_output_path: config/schemas # JSON Schema output
enable_value_resolver: true # Enable controller DTO auto-resolutionbin/console dto:initThis creates a config/dtos.php file with a sample DTO definition (PHP format is the default).
You can also use --format=xml or --format=yaml.
The generated config looks like:
use PhpCollective\Dto\Builder\Dto;
use PhpCollective\Dto\Builder\Field;
use PhpCollective\Dto\Builder\Schema;
return Schema::create()
->dto(Dto::create('User')->fields(
Field::int('id'),
Field::string('name'),
Field::string('email')->nullable(),
))
->toArray();bin/console dto:generateOptions:
--dry-run- Preview changes without writing files--config-path- Override config path--output-path- Override output path--namespace- Override namespace-v- Verbose output
bin/console dto:typescript
bin/console dto:typescript --multiple-files --readonlybin/console dto:jsonschema
bin/console dto:jsonschema --multiple-filesuse App\Dto\UserDto;
$user = new UserDto([
'id' => 1,
'name' => 'John Doe',
'email' => 'john@example.com',
]);
return $this->json($user->toArray());use App\Dto\UserDto;
use PhpCollective\SymfonyDto\Mapper\DtoMapper;
$dto = DtoMapper::fromArray(['name' => 'Mark'], UserDto::class);
$dtos = DtoMapper::fromIterable($rows, UserDto::class);
$collection = DtoMapper::fromCollection($doctrineCollection, UserDto::class);
// Generic pagination wrapper
$pagination = DtoMapper::fromPaginated(
items: $pageItems,
total: $total,
perPage: $perPage,
page: $page,
dtoClass: UserDto::class,
);use PhpCollective\SymfonyDto\Http\DtoJsonResponse;
return DtoJsonResponse::fromDto($dto);
// or
return DtoJsonResponse::fromCollection($dtos);When enable_value_resolver is enabled, you can use #[MapRequestDto] to map request data to DTOs:
use PhpCollective\SymfonyDto\Attribute\MapRequestDto;
#[Route('/users', methods: ['POST'])]
public function create(#[MapRequestDto] UserDto $dto): Response
{
// $dto is built from request data
}The source option controls where data comes from: body, query, request, or auto.
The bundle automatically registers Doctrine's ArrayCollection for DTO collection fields. Define collection fields with the [] suffix:
Field::array('roles', 'Role'), // Role[] collection
Field::array('tags', 'string'), // string[] collectionAfter generating, collection fields use Doctrine's ArrayCollection class with its methods (filter, map, first, etc.).
Automatically convert DTO validation rules to Symfony Validator constraints:
use PhpCollective\SymfonyDto\Validation\DtoConstraintBuilder;
use Symfony\Component\Validator\Validation;
$constraint = DtoConstraintBuilder::fromDto(new UserDto());
$violations = Validation::createValidator()->validate($data, $constraint);See Usage docs for details.
The bundle supports multiple config file formats:
dtos.php- PHP format (default)dto.xml- XML formatdto.yml/dto.yaml- YAML formatdto/subdirectory with multiple files
MIT