Arsitektur Symfony dan Hexagonal

Pada artikel ini, kita akan membahas secara singkat teori dan, dalam praktiknya, mencari cara untuk menerjemahkan aplikasi Legacy apa pun ke arsitektur heksagonal. Narasinya akan berada dalam konteks kerangka kerja Symfony dan PHP 7.4, tetapi sintaks contoh yang diberikan sangat sederhana sehingga Anda dapat dengan mudah memahami cara melakukan hal yang sama dalam bahasa pemrograman Anda (jika mendukung OOP).







Selama karir saya, saya telah mengerjakan banyak proyek Symfony, dan salah satu masalah yang paling sering dihadapi klien untuk menghubungi perusahaan kami adalah bahwa perangkat lunak mereka "dikunci" oleh versi lama kerangka kerja atau menjadi tidak dijaga karena menemukan dan memperbaiki bug terlalu mahal.







Biasanya, saya mencoba mendapatkan pemahaman yang baik tentang mengapa proyek warisan ini ada di negara bagian ini. Dan seringkali saya menemukan pola yang sama: tim di awal proyek harus cepat membuat aplikasi dari awal, karena tenggat waktunya ketat.







Proses perkembangan mereka dimulai seperti ini:







  • instal proyek kerangka symfony menggunakan komposer
  • hapus kode demo
  • model generasi otomatis
  • pengontrol yang dibuat secara otomatis
  • sekarang semuanya siap untuk mengembangkan aplikasi (logika bisnis)


, - , - .







, 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