«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2019/08/04 20:09:48  №1448190 1
Чем отличается Table Data Gateway и Репозиторий?
Ответы: >>1448286
Аноним 2019/08/05 04:28:10  №1448286 2
>>1448190

Давай почитаем определения от Мартина Фаулера (на сайте только выжимка, полные описания даны в его книге):

https://martinfowler.com/eaaCatalog/tableDataGateway.html

> A Table Data Gateway holds all the SQL for accessing a single table or view: selects, inserts, updates, and deletes. Other code calls its methods for all interaction with the database.

https://martinfowler.com/eaaCatalog/repository.html

> A Repository mediates between the domain and data mapping layers, acting like an in-memory domain object collection. Client objects construct query specifications declaratively and submit them to Repository for satisfaction. Objects can be added to and removed from the Repository, as they can from a simple collection of objects, and the mapping code encapsulated by the Repository will carry out the appropriate operations behind the scenes. Conceptually, a Repository encapsulates the set of objects persisted in a data store and the operations performed over them, providing a more object-oriented view of the persistence layer.

Разница, на мой взгляд, в том, что TDG лишь содержит в себе набор методов со всеми SQL запросами к одной таблице. А Repository представляет таблицу как коллекцию с записями, в которой их можно искать, добавлять, удалять. При этом Repository используется как часть Data Mapper (который пытается представить набор записей в БД, как будто это граф связанных объектов, находящихся в памяти).

То есть TDG - просто набор методов и запросов для работы с таблицей, Repository - это как-бы коллекция объектов и используется обычно в рамках Data Mapper.

На практике, если мы возьмем ORM (Object-Relation Mapper) Доктрина, то вот класс встроенного в неё репозитория: https://github.com/doctrine/orm/blob/master/lib/Doctrine/ORM/EntityRepository.php

Видно, что он позволяет только искать данные, но не добавлять/удалять. И также очевидно, что он не является TDG, так как не содержит в себе все возможные SQL запросы для работы с определенной таблицей.

Тебе было бы полезно изучить все связанные с ORM паттерны (Data Mapper, Unit of Work, Identity Map), а также почитать документацию и может быть, код Доктрины. Это поможет тебе лучше понять как устроен ORM и какие паттерны в нем используются. Ну и знание Доктрины пригодится, если ты планируешь работать PHP разработчиком. Она сложная, но если изучать постепенно, то можно разобраться.

Задавай вопросы (в новом треде >>1446969 (OP) ), если что-то непонятно.