Шаблон рівня обслуговування в XOOPS
2.5.x ✅ 4.0.x ✅
Шаблон рівня обслуговування інкапсулює бізнес-логіку в виділені класи обслуговування, забезпечуючи чіткий розподіл між контролерами та рівнями доступу до даних. Цей шаблон сприяє багаторазовому використанню коду, тестуванню та зручності обслуговування.
Концепція рівня обслуговування
Section titled “Концепція рівня обслуговування”Сервісний рівень:
- Містить бізнес-логіку домену
- Координує кілька сховищ
- Виконує складні операції
- Керує транзакціями
- Виконує перевірку та авторизацію
- Забезпечує операції високого рівня для контролерів
Переваги
Section titled “Переваги”- Багаторазова бізнес-логіка на кількох контролерах
- Легко тестувати в ізоляції
- Впровадження централізованого бізнес-правила
- Чіткий розподіл проблем
- Спрощений код контролера
Ін’єкція залежності
Section titled “Ін’єкція залежності”<?php// Service with injected dependenciesclass 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); } }}?>Сервісний контейнер
Section titled “Сервісний контейнер”<?phpclass 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 “Використання в контролерах”<?phpclass 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(), ]; } }}?>Найкращі практики
Section titled “Найкращі практики”- Кожна служба обробляє одну проблему домену
- Послуги залежать від інтерфейсів, а не від реалізації
- Використовуйте впровадження конструктора для залежностей
- Послуги повинні тестуватися окремо
- Створювати винятки для домену
- Сервіси не повинні залежати від деталей запиту HTTP
- Зберігайте послуги зосередженими та згуртованими
Пов’язана документація
Section titled “Пов’язана документація”Дивіться також:
- MVC-шаблон для інтеграції контролера
- Шаблон сховища для доступу до даних
- DTO-Pattern для об’єктів передачі даних
- Тестування для тестування служби
Теги: #сервісний-рівень #бізнес-логіка #впровадження залежностей #шаблони проектування