Design pattern-ul Data mapper explicat in PHP

Design Patterns | Stefanescu Mihai | 2023-02-10

Design pattern-ul Data Mapper este un design folosit pentru a separa in 2 niveluri datele si logica de business a aplicatiei. Acest pattern este des folosit in sistemele de tip object relational mapping (ORM).

In acest pattern, datele sunt transferate intre obiecte in aplicatie, tinandu-se pe obiecte separate datele de logica de business (vezi active record, unde un model putea avea atat date cat si logica de business). Facand aceasta separare ne putem pastra obiectele ce se ocupa de date fara logica, iar obiectele de logica doar cu logica, facandu-le mai usor de modificat, intretinut si testat.

Hai sa discutam de un exemplu practic despre cum functioneaza acest pattern.

Prima data trebuie sa definim un obiect ce reprezinta datele stocate in baza de date. Acest obiect va avea proprietati ce corespund campurilor din tabela dorita, dar nu va contine nicio bucata de logica (vezi save/find/update/delete de pe un model din pattern-ul Active Record)

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

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

    // Getteri si setteri pentru proprietati
}

Acum, avem nevoie de un obiect de tip data mapper  ce se va ocupa de logica de access a datelor. Acest obiect va avea metode pentru crearea, selectarea, modificarea si stergerea datelor din baza de date.

class UserMapper {
    private $pdo;

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

    public function find($id) {
        // codul pentru a efectua un select dupa id
    }

    public function save(User $user) {
        // codul pentru a salva un obiect in baza de date
    }

    public function delete(User $user) {
        // codul pentru a sterge un obiect din baza de date
    }
}

Acum, putem folosi obiectul de tip mapper pentru a interactiona cu baza de date.

$pdo = new PDO('mysql:host=localhost;dbname=invata_programare', 'user', 'password');
$userMapper = new UserMapper($pdo);

$user = $userMapper->find(1);
$user->username = 'm105';
$userMapper->save($user);

Folosind acest design pattern, data mapper, poti mentine la nivele separate logica de business de datele din baza de date,facand codul mai usor de inteles, intretinut si testat. Pe langa acest aspect, ar trebui sa avem in vedere si ca putem encapsula cod specific pentru ubaza de date astfel facnd mai usor schimbarea de la un sistem de baze de date, daca este nevoie.


Imi place ce faci aici
Daca iti place ce fac aici imi poti cumpara o cafea Buy Me a Coffee at ko-fi.com

Stefanescu Mihai
Programator de ~8 ani, am lucrat la proiecte din mai multe industrstrii, de la eCommerce la telecomunicatii la automatizari. In acest timp am folosi diferite tehnologii, de la PHP, MySQL, PostgreSql, RabbitMq, Redis, Memcached si altele.
       

Get in touch
Pentru nelamuriri, dubii, comentarii si chestii de pe suflet ne putem auzi pe Discord, Reddit sau poti deschide o discutie noua pe forum.

Posteaza un comentariu

Comentarii

Inca nu au fost postate comentarii, fii primul care posteaza un comentariu!

Club-ul este dedicat membrilor si ofera access la mai multe zone ale website-ului.

🗝ïļ Login 🌟 Register

🔖 Bookmarks ⊞
âœĻ Pentru a sustine aceasta comunitate am sa te rog sa te autentifici sau sa te inregistrezi!

🌊ïļ Discord ⊞

Folosim cookie-uri pentru a oferi functionalitatile critice ale aplicatiei Invata-Programare. Folosim cookie-uri si pentru a analiza traficul, pentru care e nevoie de consimtamantul dvs. explicit.

⮆ïļ