Interface для Repository и Service, как правильно сделать?
Пишу проект на Laravel и использую паттерн Repository, где собственно отдельно работаю с ORM и отдельно с данными в Service. Например UserRepositiry и UserService.
Например CRUD, я хотел бы завести Interface и использовать его и в UserRepository и в UserService. Например UserContract. Правильный ли это подход. Если нет, то подcкажите, как правильно, ведь в конструктор контроллера я хочу передавать UserContact $userContract, но и не хочу разделять интерефейсы, на UserServiceContract и UserRepositoryContract, где часть методов будет похожа. Как правильно сделать?
Использование repository совместно с элоквентом, который реализует active record, часто оказывается неблагодарным занятием (класс репозитория особо не экономит читаемость запросов, а дополнительную прослойку создает). Можно инкапсулировать запросы прямо в сервисах (как private/protected методы) или public, если их многоразовое использование оправдано)
Вы плодите лишние сущности, которые к тому же занимаются дублированием.
Ваш UserService должен принимать UserRepository и работать с данными через него.
Так же и контроллер должен работать с UserService и не работать напрямую с UserRepository.
Простая цепочка UserModel -> UserRepository -> UserService -> UserController. Если вы начнёте переставлять звенья, то цепочка запутается и будет хуже чем прямая работа с UserModel.
Интрефейсы я упустил, в 99% в таком кейсе они не имеют смысл, т.к. в проекте у вас будет одна реализация каждой сущности. Плодить интерфейсы ради интерфейсов не стоит. Так же как и репозитории ради репозиториев. Всегда задавайте себе вопрос - зачем я пишу этот код, зачем ввожу это слой, это реально мне надо?