Перейти до вмісту

Шаблон рівня обслуговування в XOOPS

2.5.x ✅ 4.0.x ✅

Шаблон рівня обслуговування інкапсулює бізнес-логіку в виділені класи обслуговування, забезпечуючи чіткий розподіл між контролерами та рівнями доступу до даних. Цей шаблон сприяє багаторазовому використанню коду, тестуванню та зручності обслуговування.

Концепція рівня обслуговування

Section titled “Концепція рівня обслуговування”

Сервісний рівень:

  • Містить бізнес-логіку домену
  • Координує кілька сховищ
  • Виконує складні операції
  • Керує транзакціями
  • Виконує перевірку та авторизацію
  • Забезпечує операції високого рівня для контролерів
  • Багаторазова бізнес-логіка на кількох контролерах
  • Легко тестувати в ізоляції
  • Впровадження централізованого бізнес-правила
  • Чіткий розподіл проблем
  • Спрощений код контролера
<?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];
}
}
?>

Використання в контролерах

Section titled “Використання в контролерах”
<?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(),
];
}
}
}
?>
  • Кожна служба обробляє одну проблему домену
  • Послуги залежать від інтерфейсів, а не від реалізації
  • Використовуйте впровадження конструктора для залежностей
  • Послуги повинні тестуватися окремо
  • Створювати винятки для домену
  • Сервіси не повинні залежати від деталей запиту HTTP
  • Зберігайте послуги зосередженими та згуртованими

Пов’язана документація

Section titled “Пов’язана документація”

Дивіться також:


Теги: #сервісний-рівень #бізнес-логіка #впровадження залежностей #шаблони проектування