Перейти к содержимому

Паттерн Repository в XOOPS

2.5.x ✅ 4.0.x ✅

Паттерн Repository — это паттерн доступа к данным, который абстрагирует операции с базой данных, обеспечивая чистый интерфейс для доступа к данным. Он действует как посредник между слоем бизнес-логики и слоем отображения данных.

Паттерн Repository обеспечивает:

  • Абстракцию деталей реализации базы данных
  • Легкое мокирование для unit тестирования
  • Централизованную логику доступа к данным
  • Гибкость для изменения базы данных без влияния на бизнес-логику
  • Переиспользуемую логику доступа к данным по всему приложению

Используйте Repositories когда:

  • Передаете данные между слоями приложения
  • Нужно изменить реализацию базы данных
  • Пишете тестируемый код с mocks
  • Абстрагируете паттерны доступа к данным
<?php
// Define repository interface
interface UserRepositoryInterface
{
public function find($id);
public function findAll($limit = null, $offset = 0);
public function findBy(array $criteria);
public function save($entity);
public function update($id, $entity);
public function delete($id);
}
// Implement repository
class UserRepository implements UserRepositoryInterface
{
private $db;
public function __construct($connection)
{
$this->db = $connection;
}
public function find($id)
{
// Implementation
}
public function save($entity)
{
// Implementation
}
}
?>
<?php
class UserService
{
private $userRepository;
public function __construct(UserRepositoryInterface $userRepository)
{
$this->userRepository = $userRepository;
}
public function registerUser($username, $email, $password)
{
// Check if user exists
if ($this->userRepository->findByUsername($username)) {
throw new \InvalidArgumentException('Username exists');
}
// Create user
$user = new User();
$user->setUsername($username);
$user->setEmail($email);
$user->setPassword($password);
return $this->userRepository->save($user);
}
}
?>
  • Используйте интерфейсы для определения контрактов repository
  • Каждый repository обрабатывает один тип сущности
  • Держите бизнес-логику в services, а не в repositories
  • Используйте entity объекты для отображения данных
  • Выбрасывайте подходящие исключения для недопустимых операций

See also:


Tags: #repository-pattern #data-access #design-patterns #module-development