+4

Thực hành với Domain Driven Design (Phần 2)

Chào mừng mọi người với phần 2 của series thực hành với DDD!

Xem lại Phần 1

API Get list meterials

  • Controller

MaterialListGetController.php

final class MaterialListGetController
{
    public function __invoke()
    {
        $service = new MaterialListGetApplicationService(
          new MaterialRepository()
        );

        $result = $service->handle();

        return response()->json($result->toArray());
    }
}
  • Application Service

MaterialListGetApplicationService.php

final class MaterialListGetApplicationService
{
    private IMaterialRepository $materialRepository;

    public function __construct(IMaterialRepository $materialRepository)
    {
        $this->materialRepository = $materialRepository;
    }

    public function handle(): IResult
    {
        $collection = $this->materialRepository->find();

        return new MaterialListResult($collection);
    }
}
  • Kết quả trả về của handle() mình sẽ định nghĩa 1 interface chung với method toArray() IResult.php
interface IResult
{
    public function toArray(): array;
}
final class MaterialListResult implements IResult
{
    /**
     * @var Material[]
     */
    private array $materials;

    // Định nghĩa response cho API ở implemented method này.
    public function toArray(): array
    {
        $data = [];
        
        foreach ($this->materials as $material) {
            $data[] = [
                'code' => $material->getCode()->getValue(),
                'name' => $material->getName()->getValue(),
                'created' => $material->getCreatedDate()->getValue(),
                'modified' => $material->getUpdatedDate()->getValue(),
            ];
        }
        
        return [
            'data' => $data,
        ];
    }
}
  • Infrastructure layer: Get data from DB

MaterialRepository.php

    public function find(): array
    {
        $sql = <<<SQL
SELECT
    *
FROM
    materials
ORDER BY 
    code
SQL;
        $records = DB::select($sql);
        
        $result = [];
        
        // set object values
        foreach ($records as $record) {
            $entity = Material::create();
            $entity->setName(new MaterialName($record->name));
            $entity->setCode(new MaterialCode($record->code));
            $entity->setCreatedDate(new Date($record->created));
            $entity->setUpdatedDate(new Date($record->modified));
            
            $result[] = $entity;
        }
        
        return $result;
    }

Trong bài viết lần này mình đã đề cập qua những class và cách implement cho một API Get theo Domain Driven Design. Hẹn gặp các bạn ở bài viết lần sau.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí