Architecture Symfony et hexagonale

Dans cet article, nous passerons brièvement en revue la théorie et, en pratique, découvrirons comment traduire une application Legacy en une architecture hexagonale. La narration sera dans le contexte du framework Symfony et PHP 7.4, mais la syntaxe des exemples donnés est si simple que vous pouvez facilement comprendre comment faire de même dans votre langage de programmation (s'il prend en charge la POO).







Au cours de ma carrière, j'ai travaillé sur de nombreux projets Symfony, et l'un des problèmes les plus fréquents avec lesquels les clients appellent notre entreprise est que leur logiciel est "verrouillé" par une ancienne version du framework ou est devenu sans surveillance car il trouve et corrige les bugs est trop cher.







En général, j'essaie de bien comprendre pourquoi ces projets hérités sont dans cet état. Et souvent j'ai trouvé un schéma commun: l'équipe au début du projet a besoin de créer rapidement une application à partir de zéro, car les délais sont serrés.







Leur processus de développement commence quelque chose comme ceci:







  • installer le projet squelette symfony en utilisant composer
  • supprimer le code de dĂ©monstration
  • gĂ©nĂ©ration automatique de modèles
  • gĂ©nĂ©ration automatique de contrĂ´leurs
  • maintenant tout est prĂŞt pour le dĂ©veloppement d'une application (logique mĂ©tier)


, - , - .







, flow .







, , Symfony ( ) , ​​ , — «domain», .







, , , :







  • ,
  • ,


, , : .









- , -, 2005 .







, ​​, , , . . ()







, : ?







, , , , . , , .









, 10 , PHP, .







PHP , composer-, -, .







, .







— (not maintainable).







.







, , , -.







, . .







« » — , - .







, , , , , .







, , , .







, , , .







/ , , .







:









class Payment
{
  public function pay(Request $request): void
  {
     $gateway = new YourBankGateway();
     $gateway->pay($request->get('amount'));
  }
}

      
      





, :







  • pay Request, - HTTP. , , , - .
  • YourBankGateway , , , , .


:









interface GatewayProvider {
    public function pay(Money $amount): void;
}

class YourBankGateway implements GatewayProvider {
    public function pay(Money $amount): void
    {
        //do stuff..
    }
}

class Payment {
    private GatewayProvider $gateway;

    public function __construct(GatewayProvider $gateway)
    {
        $this->gateway = $gateway;
    }

    public function payThroughGateway(Money $amount): void
    {
        $this->gateway->pay($amount);
   }
}

      
      





, , .







: Payment - HTTP , Money ( DTO) Request.







, .











«» () .







— , () , .







— , , .







?







  • () -


, .











, : , :







  • ,
  • ,
  • , API


, : , .







:







  • : , …


:







  • ( )


:







  • , CLI


?



. “ -” .







, .







, .









, .







( UI, API ..), (, . .). .







— .







:









interface ProductRepositoryInterface
{
   public function find(ProductId $id): ?Product;
}

      
      





— , . , .









— , , .







.







:









class MysqlProductRepository implements ProductRepositoryInterface
{
    private $repository;

    public function __construct(ProductRepository $repository)
    {
        $this->repository = $repository;
    }

    public function find(ProductId $id): ?Product
    {
        return $this->repository->find(id);
    }
}

      
      





.













, CLI HTTP-, . .







, , , .







, PHP :













: Payment Cart.







, . , .







- ( , UUID ramsey/uuid).







, .







.







, .











, , .







, . .













, .







, .







.









, :







  • , , . unit-.
  • , , , .
  • composer-, , . ., . , .
  • , .




, , , .







?



, , , .







, Infrastructure Domain.







.







, , pull- .







legacy , , :







, .







Let’s Make Our Projects Great Again



:







  • DDD (Domain-driven design)
  • CQRS ( )
  • Event sourcing
  • TDD
  • BDD


, .








All Articles