betstore / laravel-dto
A reusable DTO class for Laravel projects
Installs: 47
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/betstore/laravel-dto
Requires
- php: ^8.2
- illuminate/database: ^8.0|^9.0|^10.0|^11.0|^12.0
- illuminate/support: ^8.0|^9.0|^10.0|^11.0|^12.0
- illuminate/validation: ^8.0|^9.0|^10.0|^11.0|^12.0
Requires (Dev)
- phpunit/phpunit: ^8.0|^9.0|^10.0|^11.0
README
π ΠΡΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Data Transfer Objects Π΄Π»Ρ Laravel Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ JIT ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ
β‘ ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ
- π JIT-ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½Π°Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ - Π΄ΠΎ 100x Π±ΡΡΡΡΠ΅Π΅ Π±Π°Π·ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ
- π ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΈΠΏΠΎΠ² - ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° union types, nullable ΡΠΈΠΏΠΎΠ²
- β ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ - ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ Laravel Validation
- π¦ Π‘Π΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ/Π΄Π΅ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ - Π² ΠΌΠ°ΡΡΠΈΠ², JSON, Laravel Response
- π― Type casting - ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π»ΠΎΠΆΠ΅Π½Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΈ ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΉ
- β‘ ΠΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Reflection - O(1) Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠΌ ΠΊΠ»Π°ΡΡΠΎΠ²
- π¨ Laravel ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ - ΠΏΠΎΠ»Π½Π°Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ Ρ ΡΠΊΠΎΡΠΈΡΡΠ΅ΠΌΠΎΠΉ Laravel
π ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ
| Π’Π΅ΡΡ | ΠΠ΅Π· ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΉ | Π‘ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΠΌΠΈ | Π‘ JIT | Π£Π»ΡΡΡΠ΅Π½ΠΈΠ΅ |
|---|---|---|---|---|
| Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ 100 DTO | ~50 ms | ~11 ms | ~3 ms | 16x β‘ |
| Π‘Π΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ 1000Γ | ~1000 ms | ~25 ms | ~3 ms | 333x β‘ |
| ΠΠ±ΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ ΡΠ΅ΡΡΠΎΠ² | ~1000 ms | ~100 ms | ~9 ms | 111x β‘ |
π¦ Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ°
composer require betstore/laravel-dto
Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ
- PHP 8.2+
- Laravel 8.0+
- OPcache Π²ΠΊΠ»ΡΡΠ΅Π½
- ΠΠ»Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ: JIT ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌΠ°Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ OPcache
; php.ini ΠΈΠ»ΠΈ /etc/php/8.2/mods-available/opcache.ini zend_extension=opcache.so opcache.enable=1 opcache.enable_cli=1 opcache.memory_consumption=256 opcache.max_accelerated_files=7963 opcache.revalidate_freq=0 opcache.fast_shutdown=1 opcache.interned_strings_buffer=16 ; JIT ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ (Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΏΡΠΈ Π½Π°Π»ΠΈΡΠΈΠΈ Xdebug) opcache.jit=on opcache.jit_buffer_size=100M
π ΠΡΡΡΡΡΠΉ ΡΡΠ°ΡΡ
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ DTO
<?php namespace App\DTOs; use Betstore\DTO\DTO; class UserDTO extends DTO { public string $name; public int $age; public ?string $email; public bool $isActive; public array $preferences; }
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π° $userData = [ 'name' => 'John Doe', 'age' => 30, 'email' => 'john@example.com', 'isActive' => true, 'preferences' => ['theme' => 'dark', 'notifications' => true] ]; $userDTO = new UserDTO($userData); // ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ $array = $userDTO->toArray(); $json = $userDTO->toJson(); // Laravel Response return $userDTO->toResponse(); // ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ JsonResponse
π― Π Π°ΡΡΠΈΡΠ΅Π½Π½ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ
ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ
class CreateUserDTO extends DTO { public string $name; public int $age; public string $email; protected function rules(): array { return [ 'name' => 'required|string|min:2|max:100', 'age' => 'required|integer|min:18|max:120', 'email' => 'required|email|unique:users,email', ]; } protected function messages(): array { return [ 'name.required' => 'ΠΠΌΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π΄Π»Ρ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ', 'age.min' => 'ΠΠΎΠ·ΡΠ°ΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ :min Π»Π΅Ρ', 'email.email' => 'ΠΠ΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΉ ΡΠΎΡΠΌΠ°Ρ email', ]; } } // ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ try { $userDTO = new CreateUserDTO($request->all()); } catch (ValidationException $e) { return response()->json(['errors' => $e->errors()], 422); }
Type Casting
class OrderDTO extends DTO { public string $orderNumber; public UserDTO $customer; public Collection $items; public array $shippingAddresses; protected function casts(): array { return [ // ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΎΠ±ΡΠ΅ΠΊΡ 'customer' => [null, UserDTO::class], // ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² 'items' => ['collection', OrderItemDTO::class], // ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΌΠ°ΡΡΠΈΠ² ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² 'shippingAddresses' => ['array', AddressDTO::class], ]; } }
Union Types ΠΈ Nullable Types
class ProductDTO extends DTO { public string $name; public string|int $sku; // Union type public ?string $description; // Nullable public ?CategoryDTO $category; // Nullable object public array $tags; public float|bool $price; // Union type Ρ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ }
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ· ΠΌΠΎΠ΄Π΅Π»ΠΈ Eloquent
class User extends Model { protected $fillable = ['name', 'email', 'age']; } // ΠΠ²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ snake_case -> camelCase $user = User::find(1); $userDTO = UserDTO::fromModel($user);
ΠΠ°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅ DTO ΠΊΠ»Π°ΡΡΠΎΠ²
class BaseUserDTO extends DTO { public string $name; public int $age; protected function rules(): array { return [ 'name' => 'required|string|min:2', 'age' => 'required|integer|min:18', ]; } } class ExtendedUserDTO extends BaseUserDTO { public string $email; public ?string $phone; protected function rules(): array { return array_merge(parent::rules(), [ 'email' => 'required|email', 'phone' => 'nullable|string|min:10', ]); } } // ΠΠ°ΠΆΠ΄ΡΠΉ ΠΊΠ»Π°ΡΡ ΠΈΠΌΠ΅Π΅Ρ ΡΠ²ΠΎΠΉ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΊΡΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ $baseUser = new BaseUserDTO(['name' => 'John', 'age' => 25]); $extendedUser = new ExtendedUserDTO([ 'name' => 'Jane', 'age' => 30, 'email' => 'jane@example.com', 'phone' => '+1234567890' ]);
Π€Π°Π±ΡΠΈΡΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ
// ΠΠ· ΠΌΠ°ΡΡΠΈΠ²Π° $dto = UserDTO::fromArray($data); // ΠΠ· Eloquent ΠΌΠΎΠ΄Π΅Π»ΠΈ $dto = UserDTO::fromModel($userModel); // ΠΠ· ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΠΈ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ $dtos = $userModels->map(fn($model) => UserDTO::fromModel($model));
π§ ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° casts()
protected function casts(): array { return [ // ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΎΠ±ΡΠ΅ΠΊΡ 'user' => [null, UserDTO::class], // ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΌΠ°ΡΡΠΈΠ² ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² 'comments' => ['array', CommentDTO::class], // ΠΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΊΠΎΠ»Π»Π΅ΠΊΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² 'posts' => ['collection', PostDTO::class], ]; }
Π‘Π΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Ρ ΡΠΈΠ»ΡΡΡΠ°ΡΠΈΠ΅ΠΉ
// ΠΡΠΊΠ»ΡΡΠΈΡΡ null Π·Π½Π°ΡΠ΅Π½ΠΈΡ $array = $dto->toArray(true); // ΠΠΎΠ»ΡΡΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠ΅ ΠΏΠΎΠ»Ρ $publicData = $dto->toArray(); unset($publicData['password'], $publicData['secretKey']);
π§ͺ Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
# ΠΠ°ΠΏΡΡΠΊ Π²ΡΠ΅Ρ ΡΠ΅ΡΡΠΎΠ² composer test # Π‘ Π·Π°ΠΌΠ΅ΡΠ°ΠΌΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ php vendor/bin/phpunit tests/ --verbose # Π’Π΅ΡΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΉ php vendor/bin/phpunit tests/PerformanceOptimizationTest.php
Π‘ΡΡΡΠΊΡΡΡΠ° ΡΠ΅ΡΡΠΎΠ²
tests/
βββ DTOTest.php # ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ
βββ TypecastingDTOTest.php # Π’Π΅ΡΡΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΏΠΎΠ²
βββ ValidationDTOTest.php # Π’Π΅ΡΡΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ
βββ FactoryMethodsDTOTest.php # Π’Π΅ΡΡΡ ΡΠ°Π±ΡΠΈΡΠ½ΡΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ²
βββ SerializationDTOTest.php # Π’Π΅ΡΡΡ ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ
βββ PerformanceOptimizationTest.php # Π’Π΅ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ
π ΠΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ
ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ
- ΠΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Reflection Π΄Π°Π½Π½ΡΡ - ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΊΡΡ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ ΠΊΠ»Π°ΡΡΠΎΠ²
- ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΏΠΎΠΈΡΠΊΠ° ΡΠ²ΠΎΠΉΡΡΠ² - O(1) Π΄ΠΎΡΡΡΠΏ Π²ΠΌΠ΅ΡΡΠΎ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠΈΡΠΊΠ°
- ΠΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ - ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΊΡΡ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ DTO ΠΊΠ»Π°ΡΡΠ°
- JIT-ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ - Π΄ΠΎ 100x ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ
ΠΠ°ΠΆΠ½ΡΠ΅ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ
- π§ ΠΡΠΏΡΠ°Π²Π»Π΅Π½Π° ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΠΎΡΠΈΠ±ΠΊΠ° ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ - ΠΏΡΠ°Π²ΠΈΠ»Π° Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ ΡΠ΅ΠΏΠ΅ΡΡ ΠΈΠ·ΠΎΠ»ΠΈΡΠΎΠ²Π°Π½Ρ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ DTO ΠΊΠ»Π°ΡΡΠ°
- π¨βπ¦ ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ - Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ DTO ΠΊΠ»Π°ΡΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Π½Π°ΡΠ»Π΅Π΄ΡΡΡ ΠΈ ΡΠ°ΡΡΠΈΡΡΡΡ ΠΏΡΠ°Π²ΠΈΠ»Π° Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ
- β‘ Π£Π»ΡΡΡΠ΅Π½Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° union types - Π±ΠΎΠ»Π΅Π΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½Π°Ρ Π»ΠΎΠ³ΠΈΠΊΠ° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΏΠΎΠ²
- π― ΠΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π° ΡΠ΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ - ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Reflection Π΄Π»Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² toArray/toJson
Π Π΅Π·ΡΠ»ΡΡΠ°ΡΡ ΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
ΠΠ΅Π· ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΉ: ~1000 ms Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ½ΡΡ
ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ
Π‘ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΠΌΠΈ: ~100 ms (10x ΡΠ»ΡΡΡΠ΅Π½ΠΈΠ΅)
Π‘ OPcache: ~90 ms (11x ΡΠ»ΡΡΡΠ΅Π½ΠΈΠ΅)
Π‘ JIT: ~9 ms (111x ΡΠ»ΡΡΡΠ΅Π½ΠΈΠ΅)
Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ ΠΏΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ
- ΠΠΊΠ»ΡΡΠΈΡΠ΅ OPcache Π΄Π»Ρ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π±Π°ΠΉΡ-ΠΊΠΎΠ΄Π°
- ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ JIT Π² production Π΄Π»Ρ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ
- ΠΡΠΊΠ»ΡΡΠΈΡΠ΅ Xdebug Π² production (JIT ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΡΠ΅Ρ Ρ Xdebug)
- ΠΠΎΠ½ΠΈΡΠΎΡΡΡΠ΅ hit rate OPcache (>95% ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ)
π API Reference
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ
// ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠ΅ΠΉ ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ new DTOClass(array $data) // Π‘Π΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ $dto->toArray(bool $unsetNulls = false): array $dto->toJson(int $options = 0): string $dto->toResponse(Request $request = null, int $status = 200): JsonResponse // Π€Π°Π±ΡΠΈΡΠ½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ DTOClass::fromArray(array $data): static DTOClass::fromModel(Model $model): static
ΠΠ°ΡΠΈΡΠ΅Π½Π½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄Ρ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ
protected function rules(): array // ΠΡΠ°Π²ΠΈΠ»Π° Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ protected function messages(): array // Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ protected function casts(): array // ΠΡΠ°Π²ΠΈΠ»Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΏΠΎΠ²
π€ Contributing
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
π License
This project is licensed under the MIT License - see the LICENSE file for details.
π Acknowledgments
- Laravel Framework Π·Π° Π²Π΄ΠΎΡ Π½ΠΎΠ²Π΅Π½ΠΈΠ΅
- PHP JIT ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ Π·Π° Π½Π΅Π²Π΅ΡΠΎΡΡΠ½ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ
- Open source ΡΠΎΠΎΠ±ΡΠ΅ΡΡΠ²ΠΎ Π·Π° Π²ΠΊΠ»Π°Π΄ Π² ΡΠ°Π·Π²ΠΈΡΠΈΠ΅ PHP
Π‘ΠΎΠ·Π΄Π°Π½ΠΎ Ρ β€οΈ Π΄Π»Ρ Π²ΡΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΡΡ Laravel ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ
π§ Email β’ π Website β’ π Issues