Skip to content

Vzorec storitvenega sloja v XOOPS

2.5.x ✅ 4.0.x ✅

Niste prepričani, ali je to pravi vzorec?

Glejte Izbira vzorca dostopa do podatkov za drevo odločitev, ki primerja obdelovalce, repozitorije, storitve in CQRS.

Deluje danes in jutri

Vzorec storitvenega sloja deluje tako v XOOPS 2.5.x kot v XOOPS 4.0.x. Koncepti so univerzalni - razlikuje se le sintaksa:

FunkcijaXOOPS 2.5.xXOOPS 4,0
PHP Različica7,4+8,2+
Vbrizgavanje konstruktorja✅ Ročno ožičenje✅ Samodejno ožičenje zabojnika
Tipizirane lastnosti@var bloki dokumentovIzjave izvornega tipa
Lastnosti samo za branje❌ Ni na voljoreadonly ključna beseda

Spodnji primeri kode uporabljajo sintakso PHP 8.2+. Za 2.5.x izpustite readonly in uporabite tradicionalne izjave o lastnostih.

Vzorec storitvenega sloja zajema poslovno logiko v namenskih storitvenih razredih, kar zagotavlja jasno ločevanje med krmilniki in plastmi za dostop do podatkov. Ta vzorec spodbuja ponovno uporabnost kode, možnost testiranja in vzdržljivost.

Storitvena plast:

  • Vsebuje domensko poslovno logiko
  • Koordinira več skladišč
  • Obvladuje kompleksne operacije
  • Upravlja transakcije
  • Izvaja validacijo in avtorizacijo
  • Krmilnikom zagotavlja delovanje na visoki ravni### Prednosti
  • Poslovna logika za večkratno uporabo v več krmilnikih
  • Enostaven za testiranje v izolaciji
  • Centralizirano izvajanje poslovnih pravil
  • Jasno ločevanje skrbi
  • Poenostavljena koda krmilnika
<?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(),
];
}
}
}
?>
  • Vsaka storitev obravnava eno skrb domene
  • Storitve so odvisne od vmesnikov, ne od implementacij
  • Uporabite vbrizgavanje konstruktorja za odvisnosti
  • Storitve je treba testirati ločeno
  • Vrzi izjeme, specifične za domeno
  • Storitve ne smejo biti odvisne od HTTP podrobnosti zahteve
  • Storitve naj bodo osredotočene in povezane

Glej tudi:


Oznake: #service-layer #business-logic #dependency-injection #design-patterns