Lewati ke konten

Pola Lapisan Layanan di XOOPS

2.5.x ✅ 4.0.x ✅

Pola Lapisan Layanan merangkum logika bisnis dalam kelas layanan khusus, memberikan pemisahan yang jelas antara pengontrol dan lapisan akses data. Pola ini mendorong penggunaan kembali kode, kemampuan pengujian, dan pemeliharaan.

Lapisan Layanan:

  • Berisi logika bisnis domain
  • Mengkoordinasikan beberapa repositori
  • Menangani operasi yang rumit
  • Mengelola transaksi
  • Melakukan validasi dan otorisasi
  • Menyediakan operasi tingkat tinggi untuk pengontrol
  • Logika bisnis yang dapat digunakan kembali di beberapa pengontrol
  • Mudah diuji secara terpisah
  • Penerapan aturan bisnis terpusat
  • Pemisahan kekhawatiran yang jelas
  • Kode pengontrol yang disederhanakan
<?php
// Service with injected dependencies
class UserService
{
private $userRepository;
private $emailService;
public function __construct(
UserRepositoryInterface $userRepository,
EmailServiceInterface $emailService
) {
$this->userRepository = $userRepository;
$this->emailService = $emailService;
}
public function registerUser($username, $email, $password)
{
// Validate
$this->validate($username, $email, $password);
// Create user
$user = new User();
$user->setUsername($username);
$user->setEmail($email);
$user->setPassword($password);
// Save
$userId = $this->userRepository->save($user);
// Send welcome email
$this->emailService->sendWelcome($email, $username);
return $userId;
}
private function validate($username, $email, $password)
{
$errors = [];
if (strlen($username) < 3) {
$errors['username'] = 'Username too short';
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors['email'] = 'Invalid email';
}
if (strlen($password) < 6) {
$errors['password'] = 'Password too short';
}
if (!empty($errors)) {
throw new ValidationException('Invalid input', $errors);
}
}
}
?>
<?php
class ServiceContainer
{
private $services = [];
public function __construct($db)
{
// Register repositories
$this->services['userRepository'] = new UserRepository($db);
// Register services
$this->services['userService'] = new UserService(
$this->services['userRepository']
);
}
public function get($name)
{
if (!isset($this->services[$name])) {
throw new \InvalidArgumentException("Service not found: $name");
}
return $this->services[$name];
}
}
?>
<?php
class UserController
{
private $userService;
public function __construct(ServiceContainer $container)
{
$this->userService = $container->get('userService');
}
public function registerAction()
{
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
return [];
}
try {
$userId = $this->userService->registerUser(
$_POST['username'],
$_POST['email'],
$_POST['password']
);
return [
'success' => true,
'userId' => $userId,
];
} catch (ValidationException $e) {
return [
'success' => false,
'errors' => $e->getErrors(),
];
}
}
}
?>
  • Setiap layanan menangani satu masalah domain
  • Layanan bergantung pada antarmuka, bukan implementasi
  • Gunakan injeksi konstruktor untuk dependensi
  • Layanan harus dapat diuji secara terpisah
  • Lemparkan pengecualian khusus domain
  • Layanan tidak boleh bergantung pada detail permintaan HTTP
  • Jaga agar layanan tetap fokus dan kohesif

Lihat juga:


Tag: #lapisan layanan #logika-bisnis #injeksi-ketergantungan #pola-desain