stalxed
Новичок
Если представлять, что репозиторий это коллекция, уникальная коллекция, где в качестве уникального фактора выступает email - то всё встаёт на свои места.Так нет же. Какой смысл кидать логику в DAL? Завтра перекинем все из MySQL в Redis и придется опять реализовывать там уникальность email?
Есть факт - уникальная коллекция, бизнес элемент, находится в domain, определяется как ClientRepositoryInterface, в нём метод add, который может выбрасывать исключение(ну тут phpdoc).
И есть тупые, не интересные реализации, ну например MySQLClientReposotory и RedisClientRepository. Они находятся в инфраструктурном слое. И логики у них нет, они не содержат бизнес правила, они содержат код реализующий интерфейс и всё. И исключение они тоже кидают, которое находится в domain layer.
Типа эта парадигма многослойной архитектуры приправленной DI.
Вот иллюстрация с книги Вернона:
![upload_2015-12-23_19-21-34.png](/talk/data/attachments/1/1028-cb68d3f870060e52dfd37501e9045579.jpg)
Figure 4.3. The possible Layers when the Dependency Inversion Principle is used. We move the Infrastructure Layer above all others, enabling it to implement interfaces for all Layers below.
P.S.: Я обычно ещё реализую в domain layer что-то вроде InMemoryClientReposotory, шикарно помогает для юнит тестов.