1. Go to this page and download the library: Download julio-cavallari/laravel-dto library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
julio-cavallari / laravel-dto example snippets
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class CreateArticleRequest extends FormRequest
{
public function rules(): array
{
return [
'title' => ':news,sports,technology',
'tags' => 'array',
'published' => 'boolean',
];
}
}
declare(strict_types=1);
namespace App\DTOs;
use App\Http\Requests\CreateArticleRequest;
use App\Enums\StatusEnum;
use App\Enums\CategoryEnum;
/**
* Generated DTO class
*
* This class was automatically generated from a Form Request.
*
* @generated 2025-08-01 22:30:00
*/
final readonly class CreateArticleData
{
public function __construct(
public string $title,
public string $content,
public ?string $excerpt = null,
public StatusEnum $status,
public CategoryEnum $category,
public array $tags = [],
public bool $published = false,
) {
}
public static function fromRequest(CreateArticleRequest $request): self
{
return new self(
title: $request->validated('title'),
content: $request->validated('content'),
excerpt: $request->validated('excerpt', null),
status: $request->enum('status', StatusEnum::class),
category: $request->enum('category', CategoryEnum::class),
tags: $request->validated('tags', []),
published: $request->validated('published', false),
);
}
}
declare(strict_types=1);
namespace App\Enums;
enum StatusEnum: string
{
case DRAFT = 'draft';
case PUBLISHED = 'published';
case ARCHIVED = 'archived';
}
declare(strict_types=1);
namespace App\Enums;
enum CategoryEnum: string
{
case NEWS = 'news';
case SPORTS = 'sports';
case TECHNOLOGY = 'technology';
}
// Form Request
'status' => 'ger|in:1,2,3,4,5',
'language' => 'nullable|in:en,fr,es,de',
// Generated Enums
enum StatusEnum: string
{
case DRAFT = 'draft';
case PUBLISHED = 'published';
case ARCHIVED = 'archived';
}
enum PriorityEnum: int
{
case _1 = 1;
case _2 = 2;
case _3 = 3;
case _4 = 4;
case _5 = 5;
}
enum LanguageEnum: string
{
case EN = 'en';
case FR = 'fr';
case ES = 'es';
case DE = 'de';
}
namespace App\Http\Controllers;
use App\Http\Requests\CreateArticleRequest;
use App\DTOs\CreateArticleData;
use App\Services\ArticleService;
class ArticleController extends Controller
{
public function store(CreateArticleRequest $request, ArticleService $articleService)
{
$articleData = CreateArticleData::fromRequest($request);
$article = $articleService->create($articleData);
return response()->json($article, 201);
}
}
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
use JulioCavallari\LaravelDto\Contracts\HasDto;
use JulioCavallari\LaravelDto\Traits\ConvertsToDto;
class CreateArticleRequest extends FormRequest implements HasDto
{
use ConvertsToDto;
// Your existing validation rules...
}
// In your controller
public function store(CreateArticleRequest $request)
{
$articleData = $request->toDto(); // ✨ Clean and simple!
// Use the strongly typed DTO
$article = Article::create([
'title' => $articleData->title,
'content' => $articleData->content,
'excerpt' => $articleData->excerpt,
'tags' => $articleData->tags,
]);
}
namespace App\Http\Requests;
use App\DTOs\ArticleCreationData;
use Illuminate\Foundation\Http\FormRequest;
use JulioCavallari\LaravelDto\Attributes\UseDto;
use JulioCavallari\LaravelDto\Contracts\HasDto;
use JulioCavallari\LaravelDto\Traits\ConvertsToDto;
#[UseDto(ArticleCreationData::class)]
class CreateArticleRequest extends FormRequest implements HasDto
{
use ConvertsToDto;
public function rules(): array
{
return [
'title' => '
bash
# Check all Form Requests
php artisan dto:check
# Show only Form Requests without DTOs
php artisan dto:check --missing
# Show only Form Requests with DTOs
php artisan dto:check --existing
# Show detailed information
php artisan dto:check --details
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.