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.