Bereinigen Sie den PHP-Code mit DTO

Dies ist mein erster Artikel, also mach dich bereit, die Steine ​​zu fangen.





Beim Schreiben einer neuen Methode oder eines neuen Dienstes versuchen wir, diese so weit wie möglich von externen Abhängigkeiten zu abstrahieren, damit die neue Funktionalität nur die dafür festgelegte Logik implementiert. Tatsächlich sagt uns eines der SOLID- Prinzipien - das Prinzip der Einzelverantwortung .





Ich stoße ständig auf einen Code, bei dem, wenn eine Methode mehr als zwei Eingabeargumente hat, eine Bedingung (Array $ args) hinzugefügt wird, die die Implementierung einer Überprüfung auf das Vorhandensein eines Schlüssels oder dessen Fehlen und dann die Wahrscheinlichkeit beinhaltet dass die Methode zur Laufzeit übermalt werden kann, erhöht sich.





Vielleicht hat sich ein solcher Ansatz in PHP historisch entwickelt, weil es an starker Typisierung und einer solchen OOP mangelt. Schließlich war es für mich erst ab Version 7 möglich, Typing + OOP mithilfe von strict_types und Typhinweisen mehr oder weniger zu implementieren.





Der Aufruf solcher Methoden kann auch von einer Beschreibung des Arrays begleitet werden, das wir übergeben werden. Oder es wird überhaupt eine Art Array mit Müll übergeben, und die Methode nimmt einfach die Schlüssel, die sie benötigt. Zum Beispiel ein Dienst zum Erstellen eines Benutzers:





$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

  • Implementieren Sie die afterTransform-Methode, die nach der Initialisierung des DTO aufgerufen wird. Auf diese Weise können Sie das Casting flexibler an die Klasse anpassen. Wenn sich die Eingabetasten von den internen DTOs unterscheiden, müssen Sie die Transformationsmethode derzeit selbst beschreiben. Und wenn von 20 Parametern nur einer einen anderen Schlüssel hat, müssen wir die Konvertierung aller 20 beschreiben. Mit der afterTransform-Methode können wir die Konvertierung nur des benötigten Parameters anpassen, und der Rest wird von verarbeitet das Paket.





  • PHP 8 Attributunterstützung





Das ist alles.








All Articles