rahimi-ali / php-dto
Data Transfer Objects for PHP
dev-master
2023-11-07 12:16 UTC
Requires
- php: ^8.2
- psr/http-message: >=1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.14
- infection/infection: ^0.26.19
- phpstan/phpstan: ^1.9
- phpunit/phpunit: ^10.0
This package is auto-updated.
Last update: 2024-12-30 02:18:10 UTC
README
DTOs for PHP!
DTOs can be used to transform Incoming Psr7 server requests, json and random arrays to typed classes with validation built in.
Does not use reflection and handles everything with good old classes and methods!
Install
composer require rahimi-ali/php-dto
Types
int(bool $strict = false): IntType
float(bool $strict = false): FloatType
string(bool $strict = false): StringType
bool(bool $strict = false): BoolType
datetime(string $format = DateTimeInterface::ATOM, string|null $timezone = null, bool $immutable = true): DateTimeType
embedded(string $class): EmbeddedType
dynamicEmbedded(string|Closure $discriminator, array $types = []): DynamicEmbeddedType
collection(TypeInterface $type): CollectionType
Rules
int(bool $strict = false): IntRule
Automatically added when declaring a field with IntTypefloat(bool $strict = false): FloatRule
Automatically added when declaring a field with FloatTypestring(bool $strict = false): StringRule
Automatically added when declaring a field with StringTypebool(bool $strict = false): BoolRule
Automatically added when declaring a field with BoolTypearray(): ArrayRule
Should be an array with sequential int keysobject(): ObjectRule
Should be an object or an array with string keys or non-sequential int keysmin(int $min, bool $strict = false): MinRule
max(int $max, bool $strict = false): MaxRule
minLength(int $length, bool $strict = false): MinLengthRule
maxLength(int $length, bool $strict = false): MaxLengthRule
in(array $values, bool $strict = false): InRule
notIn(array $values, bool $strict = false): NotInRule
equals(mixed $value, bool $strict = false): EqualsRule
notEqual(mixed $value, bool $strict = false): NotEqual
Example
class AddressDto extends Dto { private string $city; private string $street; private int $number; public static function fields(array $data): array { return [ 'city' => new Field('city', Type::string(true), rules: [Rule::in(['London', 'Paris', 'New York'])]), 'street' => new Field('street', Type::string(true), rules: [Rule::min(5)]), 'number' => new Field('number', Type::int(true), rules: [Rule::min(1), Rule::max(100)]), ]; } public function getCity(): string { return $this->city; } public function getStreet(): string { return $this->street; } public function getNumber(): int { return $this->number; } } class UserDto extends Dto { private string $name; private int $age; private AddressDto $address; public static function fields(array $data): array { return [ 'name' => new Field('name', Type::string(true), rules: [Rule::min(5)]), 'age' => new Field('age', Type::int(true), rules: [Rule::min(18)]), 'address' => new Field('address', Type::embedded(AddressDto::class)), ]; } public function getName(): string { return $this->name; } public function getAge(): int { return $this->age; } public function getAddress(): AddressDto { return $this->address; } }
Notes
- Because reflection and magic methods were not used private and readonly properties
cannot be used because the parent class cannot access them by default. If you really want private and readonly
properties, override the
setProperty
method in you DTO:
protected function setProperty(string $property, mixed $value): void { $this->{$property} = $value; }
Standards
- Code Coverage: 100%
- PHPStan Level: 9
- Infection MSI: 94%
License
MIT