Danyloff

Шаблон Data Mapper с примерами на PHP


  • ·

· ·

Шаблон Data Mapper — это один из наиболее распространенных шаблонов проектирования, который используется для разделения бизнес-логики и работы с данными. Этот шаблон позволяет создавать объекты, которые могут работать с данными из различных источников, таких как базы данных, файлы или веб-сервисы. В этой статье мы рассмотрим, как использовать шаблон Data Mapper в PHP на примере книги Мартина Фаулера «Шаблоны корпоративных приложений».

Что такое Data Mapper?

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

Data Mapper разделяет бизнес-логику и работу с данными на две отдельные области ответственности. Бизнес-логика описывает, как работает приложение, а работа с данными описывает, как данные хранятся и извлекаются. Data Mapper позволяет создавать объекты, которые могут работать с данными из различных источников, таких как базы данных, файлы или веб-сервисы.

Пример использования Data Mapper в PHP

Для примера мы создадим простое приложение для управления пользователями. Наше приложение будет иметь следующие функции:

  • Добавление нового пользователя
  • Редактирование существующего пользователя
  • Удаление пользователя
  • Получение списка всех пользователей

Для начала создадим класс User, который будет представлять пользователя

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

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

    public function getId()
    {
        return $this->id;
    }

    public function getName()
    {
        return $this->name;
    }

    public function getEmail()
    {
        return $this->email;
    }
}

Затем создадим интерфейс UserRepository, который будет определять методы для работы с пользователями

interface UserRepository
{
    public function save(User $user);
    public function update(User $user);
    public function delete(User $user);
    public function getById($id);
    public function getAll();
}

Теперь создадим класс UserMapper, который будет реализовывать интерфейс UserRepository и работать с базой данных

class UserMapper implements UserRepository
{
    private $db;

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

    public function save(User $user)
    {
        $stmt = $this->db->prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
        $stmt->bindParam(':name', $user->getName());
        $stmt->bindParam(':email', $user->getEmail());
        $stmt->execute();
        $user->setId($this->db->lastInsertId());
    }

    public function update(User $user)
    {
        $stmt = $this->db->prepare("UPDATE users SET name = :name, email = :email WHERE id = :id");
        $stmt->bindParam(':name', $user->getName());
        $stmt->bindParam(':email', $user->getEmail());
        $stmt->bindParam(':id', $user->getId());
        $stmt->execute();
    }

    public function delete(User $user)
    {
        $stmt = $this->db->prepare("DELETE FROM users WHERE id = :id");
        $stmt->bindParam(':id', $user->getId());
        $stmt->execute();
    }

    public function getById($id)
    {
        $stmt = $this->db->prepare("SELECT * FROM users WHERE id = :id");
        $stmt->bindParam(':id', $id);
        $stmt->execute();
        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        if ($row) {
            return new User($row['id'], $row['name'], $row['email']);
        } else {
            return null;
        }
    }

    public function getAll()
    {
        $stmt = $this->db->prepare("SELECT * FROM users");
        $stmt->execute();
        $users = array();
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {

$users[] = new User($row['id'], $row['name'], $row['email']);
        }
        return $users;
    }
}

В этом примере мы использовали PDO для работы с базой данных. Класс UserMapper реализует интерфейс UserRepository и определяет методы для работы с пользователями. Метод save() добавляет нового пользователя в базу данных, метод update() обновляет существующего пользователя, метод delete() удаляет пользователя, метод getById() получает пользователя по его идентификатору, а метод getAll() получает список всех пользователей.

Теперь мы можем использовать класс UserMapper для работы с пользователями в нашем приложении

$db = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$userMapper = new UserMapper($db);

// Добавление нового пользователя
$user = new User(null, 'John Doe', '[email protected]');
$userMapper->save($user);

// Редактирование существующего пользователя
$user = $userMapper->getById(1);
$user->setName('Jane Doe');
$userMapper->update($user);

// Удаление пользователя
$user = $userMapper->getById(1);
$userMapper->delete($user);

// Получение списка всех пользователей
$users = $userMapper->getAll();
foreach ($users as $user) {
    echo $user->getName() . "\n";
}

В этом примере мы создали объект UserMapper, который работает с базой данных, и использовали его для добавления, редактирования, удаления и получения пользователей.

Заключение

Шаблон Data Mapper — это мощный инструмент для разделения бизнес-логики и работы с данными. Он позволяет создавать объекты, которые могут работать с данными из различных источников, таких как базы данных, файлы или веб-сервисы. В этой статье мы рассмотрели, как использовать шаблон Data Mapper в PHP на примере книги Мартина Фаулера «Шаблоны корпоративных приложений». Мы создали класс User, интерфейс UserRepository и класс UserMapper, который реализует интерфейс UserRepository и работает с базой данных. Мы также показали, как использовать класс UserMapper для работы с пользователями в нашем приложении.


Так же интересно