Installation:
composer require open-southeners/laravel-dto
Publish the config (if needed):
php artisan vendor:publish --provider="OpenSoutheners\DataMapper\DataMapperServiceProvider"
First Use Case:
Define a DTO class (e.g., app/Dtos/UserDto.php):
namespace App\Dtos;
use OpenSoutheners\DataMapper\Dto;
class UserDto extends Dto
{
public string $name;
public int $age;
}
Map an Eloquent model to the DTO:
use App\Models\User;
use App\Dtos\UserDto;
$user = User::find(1);
$dto = UserDto::fromModel($user); // or `UserDto::fromArray($user->toArray())`
Key Files to Review:
config/datamapper.php (for customization)app/Dtos/ (DTO definitions)app/Providers/DataMapperServiceProvider.php (if extending)DTO Creation:
$dto = UserDto::fromModel($user);
$dto = UserDto::fromArray($request->all());
$dto = new UserDto();
$dto->name = "John";
$dto->age = 30;
Validation: Use built-in validation rules or extend the DTO:
class UserDto extends Dto
{
public string $email;
public function rules(): array
{
return [
'email' => 'required|email',
];
}
}
Transformation: Convert DTOs back to arrays/models:
$array = $dto->toArray();
$model = User::fromDto($dto); // Requires custom `fromDto` method in model
API Responses: Return DTOs directly in controllers:
return response()->json(UserDto::fromModel($user));
ApiResource for structured responses.public function rules()
{
return (new UserDto())->rules();
}
$service->process(UserDto::fromModel($user));
Circular References:
ignoreMissing() or custom mappers:
$dto = UserDto::fromModel($user)->ignoreMissing(['password']);
Type Safety:
class UserDto extends Dto
{
public function __construct(
public string $name,
public int $age
) {}
}
Performance:
$user = User::with('posts')->find(1);
$dto = UserDto::fromModel($user);
dd($dto->getErrors()) to inspect validation errors.mapFromModel() or mapFromArray() for bespoke behavior:
public function mapFromModel($model)
{
$this->name = strtoupper($model->name);
return parent::mapFromModel($model);
}
config/datamapper.php:
'mappers' => [
'App\Dtos\UserDto' => \App\Mappers\UserMapper::class,
],
Dto::created(function ($dto) {
// Log or process DTO
});
DtoTestCase for assertions:
$this->assertDtoEquals($expectedDto, $actualDto);
How can I help you explore Laravel packages today?