1. Go to this page and download the library: Download dgame/php-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/ */
dgame / php-dto example snippets
use Dgame\DataTransferObject\Annotation\Name;
use Dgame\DataTransferObject\DataTransfer;
final class Limit
{
use DataTransfer;
public int $offset;
#[Name('size')]
public int $limit;
}
use Dgame\DataTransferObject\Annotation\Alias;
use Dgame\DataTransferObject\DataTransfer;
final class Limit
{
use DataTransfer;
public int $offset;
#[Alias('size')]
public int $limit;
}
use Dgame\DataTransferObject\Annotation\Alias;
use Dgame\DataTransferObject\Annotation\Name;
use Dgame\DataTransferObject\DataTransfer;
final class Foo
{
use DataTransfer;
#[Name('a')]
#[Alias('z')]
public int $id;
}
use Dgame\DataTransferObject\Annotation\Alias;
use Dgame\DataTransferObject\DataTransfer;
final class Foo
{
use DataTransfer;
#[Alias('a')]
#[Alias('z')]
public int $id;
}
use Dgame\DataTransferObject\Annotation\Cast;
final class Foo
{
use DataTransfer;
#[Cast]
public int $id;
}
use Dgame\DataTransferObject\Annotation\Cast;
final class Foo
{
use DataTransfer;
#[Cast(types: ['string', 'float', 'bool'])]
public int $id;
}
use Dgame\DataTransferObject\Annotation\Cast;
final class Foo
{
use DataTransfer;
#[Cast(method: 'toInt', class: self::class)]
public int $id;
public static function toInt(string|int|float|bool $value): int
{
return (int) $value;
}
}
use Dgame\DataTransferObject\Annotation\Cast;
function toInt(string|int|float|bool $value): int
{
return (int) $value;
}
final class Foo
{
use DataTransfer;
#[Cast(method: 'toInt')]
public int $id;
}
use Dgame\DataTransferObject\Annotation\Cast;
final class Foo
{
use DataTransfer;
#[Cast(class: self::class)]
public int $id;
public function __invoke(string|int|float|bool $value): int
{
return (int) $value;
}
}
use Dgame\DataTransferObject\Annotation\Min;
use Dgame\DataTransferObject\DataTransfer;
final class Limit
{
use DataTransfer;
#[Min(0)]
public int $offset;
#[Min(0)]
public int $limit;
}
use Dgame\DataTransferObject\Annotation\Min;
use Dgame\DataTransferObject\DataTransfer;
final class Limit
{
use DataTransfer;
#[Min(0, message: 'Offset must be positive!')]
public int $offset;
#[Min(0, message: 'Limit must be positive!')]
public int $limit;
}
use Dgame\DataTransferObject\Annotation\Max;
use Dgame\DataTransferObject\DataTransfer;
final class Limit
{
use DataTransfer;
#[Max(1000)]
public int $offset;
#[Max(1000)]
public int $limit;
}
use Dgame\DataTransferObject\Annotation\Max;
use Dgame\DataTransferObject\DataTransfer;
final class Limit
{
use DataTransfer;
#[Max(1000, message: 'Offset may not be larger than 1000')]
public int $offset;
#[Max(1000, message: 'Limit may not be larger than 1000')]
public int $limit;
}
use Dgame\DataTransferObject\Annotation\Instance;
final class Collection
{
#[Instance(class: Entity::class, message: 'We need an array of Entities!')]
private array $entities;
}
final class Foo
{
private ?int $id;
}
use Dgame\DataTransferObject\Annotation\Type;
final class Foo
{
#[Type(name: '?int')]
private ?int $id;
}
use Dgame\DataTransferObject\Annotation\Type;
final class Foo
{
#[Type(name: 'int|null')]
private ?int $id;
}
use Dgame\DataTransferObject\Annotation\Type;
final class Foo
{
#[Type(name: 'int', allowsNull: true)]
private ?int $id;
}
use Dgame\DataTransferObject\Annotation\Type;
final class Foo
{
#[Type(name: '?int', message: 'id is expected to be int or null')]
private ?int $id;
}
use Dgame\DataTransferObject\Annotation\Validation;
use Dgame\DataTransferObject\DataTransfer;
#[Attribute(Attribute::TARGET_PROPERTY)]
final class NumberBetween implements Validation
{
public function __construct(private int|float $min, private int|float $max)
{
}
public function validate(mixed $value): void
{
if (!is_numeric($value)) {
throw new InvalidArgumentException(var_export($value, true) . ' must be a numeric value');
}
if ($value < $this->min) {
throw new InvalidArgumentException(var_export($value, true) . ' must be >= ' . $this->min);
}
if ($value > $this->max) {
throw new InvalidArgumentException(var_export($value, true) . ' must be <= ' . $this->max);
}
}
}
final class ValidationStub
{
use DataTransfer;
#[NumberBetween(18, 125)]
private int $age;
public function getAge(): int
{
return $this->age;
}
}
use Dgame\DataTransferObject\Annotation\Ignore;
use Dgame\DataTransferObject\DataTransfer;
final class Foo
{
use DataTransfer;
#[Ignore]
public string $uuid = 'abc';
public int $id = 0;
}
$foo = Foo::from(['uuid' => 'xyz', 'id' => 42]);
echo $foo->id; // 42
echo $foo->uuid; // abc
use Dgame\DataTransferObject\Annotation\Reject;
use Dgame\DataTransferObject\DataTransfer;
final class Foo
{
use DataTransfer;
#[Reject(reason: 'The attribute "uuid" is not supposed to be set')]
public string $uuid = 'abc';
}
$foo = Foo::from(['id' => 42]); // Works fine
echo $foo->id; // 42
echo $foo->uuid; // abc
$foo = Foo::from(['uuid' => 'xyz', 'id' => 42]); // throws 'The attribute "uuid" is not supposed to be set'
use Dgame\DataTransferObject\Annotation\Required;
use Dgame\DataTransferObject\DataTransfer;
final class Foo
{
use DataTransfer;
#[Required(reason: 'We need an "id"')]
public ?int $id;
#[Required(reason: 'We need a "name"')]
public string $name;
}
Foo::from(['id' => 42, 'name' => 'abc']); // Works
Foo::from(['name' => 'abc']); // Fails but would work without the `Required`-Attribute since $id is nullable
Foo::from(['id' => 42]); // Fails and would fail regardless of the `Required`-Attribute since $name is not nullable and has no default-value - but the reason why it is
final class Foo
{
use DataTransfer;
#[Optional]
public int $id;
}
$foo = Foo::from([]);
assert($foo->id === 0);
final class Foo
{
use DataTransfer;
#[Optional(value: 42)]
public int $id;
}
$foo = Foo::from([]);
assert($foo->id === 42);
final class Foo
{
use DataTransfer;
#[Optional(value: 42)]
public int $id = 23;
}
$foo = Foo::from([]);
assert($foo->id === 23);
use Dgame\DataTransferObject\Annotation\Numeric;
final class Foo
{
use DataTransfer;
#[Numeric(message: 'id must be numeric')]
public int $id;
}
$foo = Foo::from(['id' => '23']);
assert($foo->id === 23);
use Dgame\DataTransferObject\Annotation\Boolean;
final class Foo
{
use DataTransfer;
#[Boolean(message: 'checked must be a bool')]
public bool $checked;
#[Boolean(message: 'verified must be a bool')]
public bool $verified;
}
$foo = Foo::from(['checked' => 'yes', 'verified' => 0]);
assert($foo->checked === true);
assert($foo->verified === false);
use Dgame\DataTransferObject\Annotation\Date;
use \DateTime;
final class Foo
{
use DataTransfer;
#[Date(format: 'd.m.Y', message: 'Your birthday must be a date')]
public DateTime $birthday;
}
$foo = Foo::from(['birthday' => '19.09.1979']);
assert($foo->birthday === DateTime::createFromFormat('d.m.Y', '19.09.1979'));
use Dgame\DataTransferObject\Annotation\In;
final class Foo
{
use DataTransfer;
#[In(values: ['beginner', 'advanced', 'difficult'], message: 'Must be either "beginner", "advanced" or "difficult"')]
public string $difficulty;
}
Foo::from(['difficulty' => 'foo']); // will throw a error, since difficulty is not in the provided values
$foo = Foo::from(['difficulty' => 'advanced']);
assert($foo->difficulty === 'advanced');
use Dgame\DataTransferObject\Annotation\NotIn;
final class Foo
{
use DataTransfer;
#[NotIn(values: ['holy', 'shit', 'wtf'], message: 'Must not be a swear word')]
public string $word;
}
use Dgame\DataTransferObject\Annotation\Matches;
final class Foo
{
use DataTransfer;
#[Matches(pattern: '/^[a-z]+\w*/', message: 'Your name must start with a-z')]
public string $name;
#[Matches(pattern: '/[1-9][0-9]+/', message: 'products must be at least 10')]
public int $products;
}
Foo::from(['name' => '_', 'products' => 99]); // will throw a error, since name does not start with a-z
Foo::from(['name' => 'John', 'products' => 9]); // will throw a error, since products must be at least 10
use Dgame\DataTransferObject\Annotation\Trim;
final class Foo
{
use DataTransfer;
#[Trim]
public string $name;
}
$foo = Foo::from(['name' => ' John ']);
assert($foo->name === 'John');
final class Person
{
use DataTransfer;
#[Path('person.name')]
public string $name;
}
final class Person
{
use DataTransfer;
#[Path('married.$value')]
public bool $married;
}
final class Person
{
use DataTransfer;
#[Path('first.name.#text')]
public string $firstname;
}
final class Person
{
use DataTransfer;
#[Path('child.{born, age}')]
public array $firstChild = [];
}
final class Person
{
use DataTransfer;
public int $id;
public string $name;
public ?int $age = null;
#[Path('ancestor.{id, name}')]
public ?self $parent = null;
}
#[SelfValidation(method: 'validate')]
final class SelfValidationStub
{
use DataTransfer;
public function __construct(public int $id)
{
}
public function validate(): void
{
assert($this->id > 0);
}
}
#[ValidationStrategy(failFast: false)]
final class Foo
{
use DataTransfer;
#[Min(3)]
public string $name;
#[Min(0)]
public int $id;
}
Foo::from(['name' => 'a', 'id' => -1]);
use Dgame\DataTransferObject\Annotation\Min;
use Dgame\DataTransferObject\DataTransfer;
final class Limit
{
use DataTransfer;
#[Min(0)]
public int $offset;
#[Min(0)]
public int $limit;
}
use Dgame\DataTransferObject\Annotation\Min;
use Dgame\DataTransferObject\DataTransfer;
final class Limit
{
use DataTransfer;
public function __construct(
#[Min(0)] public int $offset,
#[Min(0)] public int $limit
) { }
}
use Dgame\DataTransferObject\DataTransfer;
final class Bar
{
public int $id;
}
final class Foo
{
use DataTransfer;
public Bar $bar;
}
$foo = Foo::from(['bar' => ['id' => 42]]);
echo $foo->bar->id; // 42
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.