Skip to content

DTO Corak dalam XOOPS

DTO Corak (Objek Pemindahan Data) dalam XOOPS

Section titled “DTO Corak (Objek Pemindahan Data) dalam XOOPS”

2.5.x ✅ 4.0.x ✅

Objek Pemindahan Data (DTO) ialah objek mudah yang digunakan untuk memindahkan data antara lapisan aplikasi yang berbeza. DTO membantu mengekalkan sempadan yang jelas antara lapisan dan mengurangkan kebergantungan pada objek entiti.

A DTO ialah:

  • Objek nilai mudah dengan sifat
  • Tidak boleh ubah atau baca sahaja selepas penciptaan
  • Tiada logik atau kaedah perniagaan
  • Dioptimumkan untuk pemindahan data
  • Bebas daripada mekanisme kegigihan

Gunakan DTO apabila:

  • Memindahkan data antara lapisan
  • Mendedahkan data melalui API
  • Mengagregatkan data daripada berbilang entiti
  • Menyembunyikan butiran pelaksanaan dalaman
  • Mengubah struktur data untuk pengguna yang berbeza
<?php
class UserDTO
{
private $id;
private $username;
private $email;
private $isActive;
private $createdAt;
public function __construct($entity = null)
{
if ($entity instanceof User) {
$this->id = $entity->getId();
$this->username = $entity->getUsername();
$this->email = $entity->getEmail();
$this->isActive = $entity->isActive();
$this->createdAt = $entity->getCreatedAt();
}
}
// Read-only accessors
public function getId() { return $this->id; }
public function getUsername() { return $this->username; }
public function getEmail() { return $this->email; }
public function isActive() { return $this->isActive; }
public function getCreatedAt() { return $this->createdAt; }
public function toArray()
{
return [
'id' => $this->id,
'username' => $this->username,
'email' => $this->email,
'isActive' => $this->isActive,
'createdAt' => $this->createdAt,
];
}
public function toJson()
{
return json_encode($this->toArray());
}
}
?>
<?php
class CreateUserRequestDTO
{
private $username;
private $email;
private $password;
private $errors = [];
public function __construct(array $data)
{
$this->username = $data['username'] ?? '';
$this->email = $data['email'] ?? '';
$this->password = $data['password'] ?? '';
$this->validate();
}
private function validate()
{
if (empty($this->username) || strlen($this->username) < 3) {
$this->errors['username'] = 'Username too short';
}
if (empty($this->email) || !filter_var($this->email, FILTER_VALIDATE_EMAIL)) {
$this->errors['email'] = 'Invalid email';
}
if (empty($this->password) || strlen($this->password) < 6) {
$this->errors['password'] = 'Password too short';
}
}
public function isValid()
{
return empty($this->errors);
}
public function getErrors()
{
return $this->errors;
}
public function getUsername() { return $this->username; }
public function getEmail() { return $this->email; }
public function getPassword() { return $this->password; }
}
?>
<?php
class UserService
{
public function createUserFromRequest(CreateUserRequestDTO $dto)
{
if (!$dto->isValid()) {
throw new ValidationException('Invalid input', $dto->getErrors());
}
$user = new User();
$user->setUsername($dto->getUsername());
$user->setEmail($dto->getEmail());
$user->setPassword($dto->getPassword());
$userId = $this->userRepository->save($user);
return new UserDTO($user);
}
}
?>
<?php
class ApiController
{
public function createUserAction()
{
$input = json_decode(file_get_contents('php://input'), true);
$dto = new CreateUserRequestDTO($input);
if (!$dto->isValid()) {
http_response_code(400);
return ['success' => false, 'errors' => $dto->getErrors()];
}
try {
$userDTO = $this->userService->createUserFromRequest($dto);
http_response_code(201);
return ['success' => true, 'data' => $userDTO->toArray()];
} catch (\Exception $e) {
http_response_code(500);
return ['success' => false, 'message' => $e->getMessage()];
}
}
}
?>
  • Pastikan DTO fokus dan khusus
  • Jadikan DTO tidak boleh diubah atau baca sahaja
  • Jangan masukkan logik perniagaan dalam DTO
  • Gunakan DTO yang berasingan untuk input dan output
  • Dokumen DTO sifat dengan jelas
  • Pastikan DTO mudah - hanya bekas data

Lihat juga:


Tag: #dto #pemindahan-data-objek #reka-corak #pembangunan-modul