Thực hành với Domain Driven Design (Phần 2)
Bài đăng này đã không được cập nhật trong 2 năm
Chào mừng mọi người với phần 2 của series thực hành với DDD!
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