Basic usage

Common use case:

namespace DTO;
class CreateUserDTO
{
public string $email;
public float $balance;
}
$data = [
'email' => 'test@mail.com',
'balance' => 128.41,
];
$dto = (new Hydrator())->create(CreateUserDTO::class, $data);
// or static init
$dto = Hydrator::init()->create(CreateUserDTO::class, $data);
var_dump($dto);

Result:

object(\CreateUserDTO)
'email' => string(13) "test@mail.com"
'balance' => float(128.41)

Also for php 8 you can pass named arguments:

$dto = Hydrator::init()->create(CreateUserDTO::class,
email: 'test@mail.com',
balance: 128.41
);

If the property is not of a scalar type, but a class of another DTO is allowed, it will also be automatically converted.

class ProductDTO
{
public int $id;
public string $name;
}
class PurchaseDTO
{
public ProductDTO $product;
public float $cost;
}
$data = [
'product' => ['id' => 1, 'name' => 'phone'],
'cost' => 10012.23,
];
$purchaseDTO = Hydrator::init()->create(PurchaseDTO::class, $data);
var_dump($purchaseDTO);

Output:

object(PurchaseDTO)
public ProductDTO 'product' =>
object(ProductDTO)
public int 'id' => int 1
public string 'name' => string 'phone' (length=5)
public float 'cost' => float 10012.23