1. Go to this page and download the library: Download bfg/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/ */
bfg / dto example snippets
use Bfg\Dto\Dto;
class UserDto extends Dto
{
protected array $hidden = [
'password'
];
public function __construct(
public string $name,
public string $email,
public ?string $password,
) {}
}
$firstDto = UserDto::fromArray([
'name' => 'John Doe',
'email' => '[email protected]',
]);
$secondDto = UserDto::fromDto($firstDto);
// Creates a new DTO with the same properties as the first DTO
// You can cache dto before
$dto->cache();
$dto = UserDto::fromCache(function () {
// If cache not found
return UserDto::fromArray([
'name' => 'John Doe',
'email' => '[email protected]',
]);
});
use Bfg\Dto\Dto;
class UserDto extends Dto
{
public function __construct(
public string $name,
public string $email,
public ?string $password,
) {}
public static function sourceV1(...$arguments): array {
// Do something
return [
'name' => 'John Doe',
'email' => '[email protected]',
'password' => '123456',
];
}
}
$dto = UserDto::fromSource('v1', ...$arguments);
use Bfg\Dto\Dto;
class AddressDto extends Dto
{
public function __construct(
public string $city,
public string $street,
) {}
}
class CommentDto extends Dto
{
public function __construct(
public string $message,
) {}
}
class UserDto extends Dto
{
protected array $hidden = [
'password'
];
public function __construct(
public string $name,
public string $email,
public ?string $password,
public AddressDto $address,
public CommentDto|array $comments,
) {}
}
$dto = UserDto::fromArray([
'name' => 'John Doe',
'email' => '[email protected]',
'password' => '123456',
'address' => [
'city' => 'New York',
'street' => 'Wall Street',
],
'comments' => [
['message' => 'The first comment'],
['message' => 'The second comment'],
]
]);
echo $dto->address->city; // New York
// And
foreach ($dto->comments as $comment) {
echo $comment->message;
}
use Bfg\Dto\Dto;
use App\Models\User;
use Bfg\Dto\Attributes\DtoName;
class UserDto extends Dto
{
public function __construct(
public string $name,
public string $email,
#[DtoName('user_id')]
public ?User $user,
) {}
}
$dto = UserDto::fromArray([
'name' => 'John Doe',
'email' => '[email protected]',
'user_id' => 1,
// Or
'user' => 1,
]);
dump($dto->user); // User model
// In Array you will get the id of the model
dump($dto->toArray()); // ['name' => 'John Doe', 'email' => '[email protected]', 'user_id' => 1]
use Bfg\Dto\Dto;
class UserDto extends Dto
{
public function __construct(
public string $name,
public string $email,
public \Carbon\Carbon $created_at,
) {}
}
$dto = UserDto::fromArray([
'name' => 'John Doe',
'email' => '[email protected]',
'created_at' => '2025-01-01 00:00:00',
]);
dump($dto->created_at); // Carbon object
// In Array you will get the date in the format `Y-m-d H:i:s`
dump($dto->toArray()); // ['name' => 'John Doe', 'email' => '[email protected]', 'created_at' => '2025-01-01 00:00:00']
use Bfg\Dto\Dto;
class UserDto extends Dto
{
public function __construct(
public string $email,
public ?string $password,
) {}
}
use Bfg\Dto\Dto;
class UserDto extends Dto
{
protected static array $casts = [
'is_admin' => 'bool',
'created_at' => 'datetime',
];
public function __construct(
public string $name,
public string $email,
public ?string $password,
public bool $is_admin,
public \Carbon\Carbon $created_at,
) {}
}
use Bfg\Dto\Dto;
class UserDto extends Dto
{
protected array $hidden = [
'password'
];
public function __construct(
public string $name,
public string $email,
public ?string $password,
) {}
}
$dto = UserDto::fromArray([
'name' => 'John Doe',
'email' => '[email protected]',
'password' => '123456',
]);
echo $dto->toArray(); // ['name' => 'John Doe', 'email' => '[email protected]']
use Bfg\Dto\Dto;
class UserDto extends Dto
{
protected static array $rules = [
'name' => 'otected static array $ruleMessages = [
'name. public function __construct(
public string $name,
public string $email,
public ?string $password,
) {}
}
$dto = UserDto::fromArray([
'name' => 'John Doe',
]); // Throws an exception
use Bfg\Dto\Dto;
class UserDto extends Dto
{
protected array $encrypted = [
'password'
];
public function __construct(
public string $name,
public string $email,
public string $password, // Data will be decrypted
) {}
}
$dto = UserDto::fromArray([
'name' => 'John Doe',
'email' => '[email protected]',
'password' => \Illuminate\Support\Facades\Crypt::encrypt('123456'),
]);
echo $dto->password; // You will get decrypted password
dump($dto->toArray()); // ['name' => 'John Doe', 'email' => '[email protected]', 'password' => 'encrypted data']
use Bfg\Dto\Dto;
class UserDto extends Dto
{
public function __construct(
public string $name,
public string $email,
public ?string $password,
) {}
protected function fromArrayName(string $name): string
{
return ucwords($name);
}
protected function toArrayName(string $name): string
{
return strtolower($name);
}
}
use Bfg\Dto\Dto;
class UserDto extends Dto
{
public function __construct(
public string $name,
public string $lastName,
public string $email,
public ?string $password,
) {}
public function fullName(): string
{
return $this->name . ' ' . $this->lastName;
}
}
use Bfg\Dto\Dto;
class UserDto extends Dto
{
public function __construct(
public string $name,
public string $lastName,
public string $email,
public ?string $password,
) {}
public function fullName(): string
{
return $this->name . ' ' . $this->lastName;
}
}
$dto = UserDto::fromArray([
'name' => 'John',
'lastName' => 'Doe',
'email' => '[email protected]',
'password' => '123456'
]);
echo $dto->lazyEmail; // [email protected]
echo $dto->lazyFullName; // John Doe, and it put in the cache
$dto->set('name', 'Sam');
echo $dto->lazyFullName; // John Doe, because it is taken from the cache
use Bfg\Dto\Dto;
class UserDto extends Dto
{
public function __construct(
public string $name,
public string $email,
public ?string $password,
) {}
}
$dto = UserDto::fromArray([
'name' => 'John Doe',
'email' => '[email protected]',
'password' => '123456',
]);
echo $dto->name(); // John Doe
// The same as
echo $dto->get('name'); // John Doe
use Bfg\Dto\Dto;
class UserDto extends Dto
{
public function __construct(
public string $name,
public string $email,
public ?string $password,
) {}
public static function defaultName()
{
return 'Jon';
}
}
use Bfg\Dto\Dto;
class UserDto extends Dto
{
public function __construct(
public string $name,
public string $email,
public ?string $password,
public AddressDto|array $address,
// Or
public AddressDto|\Illuminate\Support\Collection $address,
) {}
}
$dto = UserDto::fromArray([
'name' => 'John Doe',
'email' => '[email protected]',
'password' => '123456',
'address' => [
['city' => 'New York', 'street' => 'Wall Street'],
['city' => 'Los Angeles', 'street' => 'Hollywood Street'],
]
]);
foreach ($dto->address as $address) {
echo $address->city;
}
use Bfg\Dto\Dto;
class UserDto extends Dto
{
public function __construct(
public string $name,
public string $lastName,
public string $email,
public ?string $password,
) {}
public function withFullName(): string
{
return $this->name . ' ' . $this->lastName;
}
}
$dto = UserDto::fromArray([
'name' => 'John',
'lastName' => 'Doe',
'email' => '[email protected]',
'password' => '123456'
]);
dump($dto->toArray()); // ['name' => 'John', 'lastName' => 'Doe', 'email' => '[email protected]', 'password' => '123456', 'fullName' => 'John Doe']
use Bfg\Dto\Dto;
class UserDto extends Dto
{
protected static bool $logsEnabled = true;
public function __construct(
public string $name,
public string $email,
public ?string $password,
) {}
}
$dto = UserDto::fromArray([
'name' => 'John Doe',
'email' => '[email protected]',
'password' => '123456',
]);
$dto->set('name', 'Sam Doe');
dump($dto->logs()); // You will get logs DTO
$dto->log(string $message, array $context = []);
$dto = UserDto::fromArray([
'name' => 'John Doe',
'email' => '[email protected]',
'password' => '123456',
]);
$dto->setMeta(['key' => 'value']);
$dto->setMeta(['key2' => 'value2']);
echo $dto->getMeta('key'); // value
echo $dto->getMeta('key2'); // value2
// You can get all meta
dump($dto->getMeta()); // ['key' => 'value', 'key2' => 'value2']
// You can remove meta
$dto->unsetMeta('key');
class UserDto extends Dto
{
public function __construct(
public string $name,
public string $email,
#[\Bfg\Dto\Attributes\DtoItem(UserContactDto::class)]
public \Bfg\Dto\Collections\DtoCollection $contacts,
) {}
}
use Bfg\Dto\Dto;
class UserDto extends Dto
{
public function __construct(
#[DtoName('user')]
public string $name,
public string $email,
public ?string $password,
) {}
}
$dto = UserDto::fromArray([
'user' => 'John Doe',
'email' => '[email protected]',
'password' => '123456'
]);
// Or
$dto = UserDto::fromArray([
'name' => 'John Doe',
'email' => '[email protected]',
'password' => '123456'
]);
echo $dto->name; // John Doe
use Bfg\Dto\Dto;
class UserDto extends Dto
{
#[DtoName('user', 'name')]
protected static array $extends = [
'name' => 'string',
];
public function __construct(
public string $email,
public ?string $password,
) {}
}
use Bfg\Dto\Dto;
class UserDto extends Dto
{
public function __construct(
public string $name,
public string $email,
public ?string $password,
#[DtoFromConfig('app.name')]
public string $appName,
) {}
}
$dto = UserDto::fromArray([
'name' => 'John Doe',
'email' => '[email protected]',
'password' => '123456'
]);
echo $dto->appName; // Laravel
use Bfg\Dto\Dto;
class UserDto extends Dto
{
public function __construct(
public string $name,
public string $email,
public ?string $password,
#[DtoFromRequest]
public string $id,
) {}
}
// https://test.dev/?id=100
$dto = UserDto::fromArray([
'name' => 'John Doe',
'email' => '[email protected]',
'password' => '123456'
]);
echo $dto->id; // 100
use Bfg\Dto\Dto;
class UserDto extends Dto
{
public function __construct(
public string $name,
public string $email,
public ?string $password,
#[DtoFromRoute]
public string $id,
) {}
}
// Route::get('/{id}', function ($id) {});
$dto = UserDto::fromArray([
'name' => 'John Doe',
'email' => '[email protected]',
'password' => '123456'
]);
echo $dto->id; // 100
use Bfg\Dto\Dto;
class UserDto extends Dto
{
public function __construct(
public string $name,
public string $email,
public ?string $password,
#[DtoFromCache('user')]
public string $userFromCache,
// Or
#[DtoFromCache]
public string $user,
) {}
}
Cache::put('user', 'John Doe', 60);
$dto = UserDto::fromArray([
'name' => 'John Doe',
'email' => '[email protected]',
'password' => '123456'
]);
echo $dto->user; // John Doe
use Bfg\Dto\Dto;
class UserDto extends Dto
{
public function __construct(
public string $name,
public string $email,
public ?string $password,
#[DtoToResource(UserAddressResource::class)]
public AddressDto $address,
) {}
}
$dto = UserDto::fromArray([
'name' => 'John Doe',
'email' => '[email protected]',
'password' => '123456',
'address' => [
'city' => 'New York',
'street' => 'Wall Street',
]
]);
echo $dto->toArray();
// ['name' => 'John Doe', 'email' => '...', 'password' => '...', 'address' => ['city' => 'New York', 'street' => 'Wall Street']]
UserDto::on('prepareSerialize', function (string $serializedString) {
// You can change the serialized string or something else
return $serializedString;
});
UserDto::on('prepareJson', function (array $arguments) {
// You can change the json array or something else
return $arguments;
});
UserDto::on('prepareRequest', function (array $arguments) {
// You can change the request array or something else
return $arguments;
});
UserDto::on('prepareArray', function (array $arguments) {
// You can change the array or something else
return $arguments;
});
UserDto::on('prepareEmpty', function () {
// You can create a new array or something else
return [];
});
UserDto::on('destruct', function (UserDto $dto) {
// You can do something with the DTO
});
$dto->toUrl(string|null $baseUrl = null, array $exclude = [], array $only = [], array $query = []): string;
$dto = UserDto::fromArray([
'name' => 'John Doe',
'email' => '[email protected]',
]);
// Generate only url parameters
echo $dto->toUrl();
// ?name=John%20Doe&email=test%40gmail.com
// Or generate parameters with base url
echo $dto->toUrl('https://example.com');
// https://example.com?name=John%20Doe&email=test%40gmail.com
// Or generate parameters with base url but without email property
echo $dto->toUrl('https://example.com', exclude: ['email']);
// https://example.com?name=John%20Doe
// Or generate parameters with base url use only email property
echo $dto->toUrl('https://example.com', only: ['email']);
// https://example.com?email=test%40gmail.com
// Or generate parameters with base url and additional query parameters
echo $dto->toUrl('https://example.com', query: ['page' => 1]);
// https://example.com?name=John%20Doe&email=test%40gmail.com&page=1
// And you can use parameters like tags in the base url
echo $dto->toUrl('https://example.com/find/{name}/name');
// https://example.com/find/John%20Doe/name?email=test%40gmail.com
// And you can convert DTO to the route.
// For example, you can have a route named 'user.profile'.
// You can use the `toUrl` method to generate a URL for that route.
echo $dto->toUrl('user.profile');
// This will generate a URL like: https://example.com/user/profile?name=John%20Doe&email=test%40gmail.com