Bersihkan kode php dengan DTO

Ini adalah artikel pertama saya, jadi bersiaplah untuk menangkap batunya.





Saat menulis metode atau layanan baru, kami mencoba mengabstraksikannya sebanyak mungkin dari dependensi eksternal sehingga fungsionalitas baru hanya mengimplementasikan logika yang ditetapkan untuknya. Faktanya, inilah yang dikatakan salah satu prinsip SOLID kepada kita - prinsip tanggung jawab tunggal .





Saya terus-menerus menemukan kode di mana jika suatu metode memiliki lebih dari dua argumen input, kondisional (array $ args) ditambahkan, yang memerlukan implementasi pemeriksaan untuk keberadaan kunci, atau tidak ada, dan kemudian kemungkinan bahwa metode tersebut dapat dicat ulang saat waktu proses bertambah.





Mungkin, pendekatan seperti itu di PHP telah berkembang secara historis, karena kurangnya pengetikan yang kuat dan OOP semacam itu. Bagaimanapun, bagi saya, hanya dari versi 7 itu mungkin untuk lebih atau kurang menerapkan pengetikan + OOP, menggunakan strict_types dan type hinting.





Selain itu, pemanggilan metode tersebut dapat disertai dengan deskripsi larik yang akan kita lewati. Atau beberapa jenis larik dengan sampah dilewatkan sama sekali, dan metode tersebut hanya mengambil kunci yang dibutuhkannya. Misalnya, layanan untuk membuat pengguna:





$userService->create([         
    'name' => $object->name,         
    'phone' => $object->phone,         
    'email' => $object->email,     
]);
      
      



, DTO’. DTO , , . . , , , .





DTO, , . . , , , , .





, .





ClassTransformer

. . , . Laravel :





class UserController extends Controller {
	public function __construct(
      private UserService $userService,
	) {}

	public function createUser(CreateUserRequest $request)
	{
      $dto = ClassTransformer::transform(CreateUserDTO::class, $request);
      $user = $this->userService->create($dto);
      return response(UserResources::make($user));
	}
}
      
      



class CreateUserDTO
{
    public string $name;
    public string $email;
    public string $phone;
}
      
      



: name, phone email. , , , . . transform , object, .  





. , DTO, :





class CreateUserDTO
{
    public string $name;
    public string $email;
    public string $phone;
    
    public static function transform(mixed $args):CreateUserDTO
    {
        $dto = new self();
        $dto->name = $args['fullName'];
        $dto->email = $args['mail'];
        $dto->phone = $args['phone'];
        return $dto;
    }
}
      
      



, , . ? , PHPDoc . , :





class PurchaseDTO
{
    /** @var array<\DTO\ProductDTO> $products Product list */
    public array $products;
    
    /** @var \DTO\UserDTO $user */
    public UserDTO $user;
}
      
      



, . .





, .. . alias , .





?









  • ,









  • ,





  • IDE .





, . Spatie - https://github.com/spatie/data-transfer-object





DTO, DTO, , . , new DTO() .





, , NestJS - plainToClass. , , . ORM ( ), :)





Roadmap

  • Implementasikan metode afterTransform yang akan dipanggil setelah DTO diinisialisasi. Ini akan memungkinkan Anda untuk lebih fleksibel menyesuaikan casting ke kelas. Saat ini, jika kunci input berbeda dari DTO internal, Anda perlu menjelaskan sendiri metode transformasi tersebut. Dan jika dari 20 parameter hanya satu yang memiliki kunci yang berbeda, kita harus menjelaskan konversi semua 20. Dan dengan metode afterTransform, kita dapat menyesuaikan konversi hanya parameter yang kita butuhkan, dan sisanya akan diproses oleh paket.





  • Dukungan Atribut PHP 8





Itu saja.








All Articles