понадобятся:
Controller
NewsService
NewsRepository
NewsEntity
NewsCollection
SearchCriteria
1. Реализуем Domain
Domains/News
-
Contracts/SearchCriteriaInterface.php имеет методы навигации, фильтров, сортировки getLimit, getPage, getFilterById и тд
-
Contracts/NewsRepositoryInterface.php имеет методы работы с хранилищем findById, findByCriteria и тд
-
NewsService.php , бизнес логика тут, создаем методы
__construct(NewsRepositoryInterface $repository)
getById(int $id): NewsEntity
getBySearchCriteria(SearchCriteriaInterface $criteria): NewsCollection
-
NewsEntity.php , обычная DTO с сеттерами и геттерами (все что осталось от модели)
-
NewsCollection.php, коллекция содержащая список NewsEntity с методами интерфейсов Iterator,ArrayAccess,Countable
2. Реализуем Application
Application/Controllers
-
HomeController.php содержит методы списка новостей и одной новости, но моно создать два контроллера со списком и с детальной инфой, все на ваше усмотрение.
__construct(NewService $service, Request $request)
index() - метод основной или на ваше усмотрение, который получает коллекцию новостей пример
$criteria = new \Infrastructure\Repositories\News\SearchCriteria;
$criteria->setLimit(10);
$newsCollection = $this->service->getBySearchCriteria($criteria);
//далее куда угодно отправляем $newsCollection или в шаблон или в JsonResponce и тд
- show(int $id), реализация страницы новости
$newsEntity = $this->service->getById($id);
3. Реализуем Infrastructure
Infrastructure/Repositories/News/
-
SearchCriteria.php реализация интерфейса SearchCriteriaInterface
-
NewsRepository.php реализация интерфейса NewsRepositoryInterface
3 этап на момент тестирования можно реализовать функционал не работая с источниками данных, то есть можно использовать заранее созданный сущности в специальных Mock репозиториях. Инжектить можно через DI, такая схема позволить покрыть код unit тестами
Плюс такого подхода что код разрабатываем не от слоя хранения а от бизнес сущностей, SOLID и все такое