Паттерн Data Mapper — это метод проектирования, используемый в разработке программного обеспечения, особенно в приложениях PHP, для отделения бизнес-логики от устойчивости данных. Это разделение улучшает управляемость кода, проверяемость и масштабируемость, изолируя то, как данные хранятся и извлекаются из основных бизнес-правил.

Понимание шаблона Data Mapper

Основная идея шаблона Data Mapper заключается в использовании выделенного слоя, называемого Data Mapper, для передачи данных между объектами и базой данных без объектов, нуждающихся в знаниях о деталях базы данных. Этот подход контрастирует с шаблоном Active Record, где сами объекты обрабатывают операции с базами данных.

Преимущества использования шаблона Data Mapper

  • Разъединение: Отделяет бизнес-логику от кода доступа к данным.
  • Проверяемость: Бизнес-логика может быть протестирована независимо от базы данных.
  • Гибкость: Изменения в схеме базы данных или методах хранения требуют минимальных изменений в бизнес-логике.
  • Устойчивость: Четкое разделение проблем упрощает управление кодом.

Внедрение Data Mapper в PHP

Внедрение шаблона Data Mapper включает в себя создание трех основных компонентов:

  • Объекты домена: Представляют субъекты предпринимательской деятельности.
  • Классы отображения данных: Обработка передачи данных между объектами и базой данных.
  • Слой базы данных: Фактическое подключение к базе данных и запросы.

Пример: Пользовательская организация

Предположим, что у нас есть класс пользователей, представляющий пользователя в нашем приложении:

class User {
 public $id;
 public $name;
 public $email;

 public function __construct($id = null, $name = '', $email = '') {
 $this->id = $id;
 $this->name = $name;
 $this->email = $email;
 }
}

Создание класса Data Mapper

Data Mapper для класса User управляет взаимодействием с базами данных:

class UserMapper {
 protected $pdo;

 public function __construct(PDO $pdo) {
 $this->pdo = $pdo;
 }

 public function findById($id) {
 $stmt = $this->pdo->prepare('SELECT * FROM users WHERE id = :id');
 $stmt->execute([':id' => $id]);
 $row = $stmt->fetch();

 if ($row) {
 return new User($row['id'], $row['name'], $row['email']);
 }
 return null;
 }

 public function save(User $user) {
 if ($user->id) {
 $stmt = $this->pdo->prepare('UPDATE users SET name = :name, email = :email WHERE id = :id');
 $stmt->execute([
 ':name' => $user->name,
 ':email' => $user->email,
 ':id' => $user->id
 ]);
 } else {
 $stmt = $this->pdo->prepare('INSERT INTO users (name, email) VALUES (:name, :email)');
 $stmt->execute([
 ':name' => $user->name,
 ':email' => $user->email
 ]);
 $user->id = $this->pdo->lastInsertId();
 }
 }
}

Заключение

Внедрение шаблона Data Mapper в PHP помогает создать чистую архитектуру, отделяя бизнес-логику от хранения данных. Этот подход не только делает ваш код более удобным для обслуживания, но также облегчает тестирование и будущие модификации, гарантируя, что ваше приложение остается надежным и адаптируемым.