DTOでphpコードをクリーンアップする

これは私の最初の記事なので、石を捕まえる準備をしてください。





新しいメソッドまたはサービスを作成するときは、外部の依存関係から可能な限り抽象化して、新しい機能がそのために設定されたロジックのみを実装するようにします。実際、これはSOLIDの原則の1つである単一責任の原則です。





メソッドに3つ以上の入力引数がある場合、条件付き(array $ args)が追加されるコードに常に遭遇します。これには、キーの存在または存在しないかどうかのチェックの実装が含まれ、その後、可能性があります。実行時にメソッドをペイントできることは増加します。





おそらく、PHPでのそのようなアプローチは、強い型付けとそのようなOOPの欠如のために、歴史的に発展してきました。結局のところ、私に関して言えば、バージョン7からのみ、strict_typesと型ヒントを使用して型付け+ OOPを多かれ少なかれ実装することができました。





また、このようなメソッドの呼び出しには、渡す配列の説明を伴うことができます。または、ガベージを含むある種の配列が渡され、メソッドは必要なキーを取得するだけです。たとえば、ユーザーを作成するためのサービスは次のとおりです。





$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

  • DTOの初期化後に呼び出されるafterTransformメソッドを実装します。これにより、クラスへのキャストをより柔軟にカスタマイズできます。現時点では、入力キーが内部DTOと異なる場合は、変換メソッドを自分で記述する必要があります。また、20個のパラメーターのうち、1つだけが異なるキーを持っている場合は、20個すべての変換を記述する必要があります。afterTransformメソッドを使用すると、必要なパラメーターのみの変換をカスタマイズでき、残りはすべて次のように処理されます。その包み。





  • PHP8属性のサポート





それで全部です。








All Articles