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!
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