Explicit source binding
Default source comes from the handle method (Body / Query).
Transform HTTP requests into strictly typed DTOs with automatic validation, casting, and full IDE support.
use Solo\RequestHandler\Attributes\{Validate, Generator};
use Solo\RequestHandler\Attributes\Source\FromRoute;
use Solo\RequestHandler\Request;
final class UpdateProductRequest extends Request
{
// PUT /products/{id}
#[FromRoute]
#[Validate('required|integer|exists:products,id')]
public int $id;
#[Validate('required|string|max:255')]
public string $name;
#[Validate('required|numeric|min:0')]
public float $price;
#[Validate('nullable|integer|min:0')]
public int $stock = 0;
#[Generator(UuidGenerator::class)]
public string $sku;
}
$dto = $requestHandler->handleBody(
UpdateProductRequest::class,
$request,
route: ['id' => $productId],
);
echo $dto->id; // int — from URL path
echo $dto->name; // string — from body
echo $dto->price; // float — auto-casted
echo $dto->sku; // string — auto-generated UUIDcomposer require solophp/request-handlerRequirements: PHP 8.2+, PSR-7 HTTP Message