Как правильно использовать сервисы и репозитории в web приложении?
Yii2 и Laravel используют Active Record вместо Entity и  Repository, то есть описание данных и доступ к ним.
Service - это слой в котором у Java выполняется бизнес-логика, хотя у .Net часто прямо в моделях. (Первое называют анемичными моделями, кто-то рассматривает это как правильную архитектуру, кто-то как антипаттерн).
Это я к тому, что в архитектуре больше философии, чем инженерии.
В общем, не заморачивайтесь. Если у Вас просто CRUD, то нет смысла плодить кучу абстракций и нужно использовать Active Record и запросы через него в контроллере.
Если запросы сложнее и это уже связано с доменной областью, то пишем в Active Query у Yii2 и методы под каждую ситуацию, чтобы при замене логики не искать по всему коду. Но это а том случае, если именно приложение, а не конкретного action.
Если какая-то простая логика, типа сложить два числа, то можно прямо в самом Active Record, если уже что-то сложнее, то выноситься в уровень Service про который Вы и спрашивали. Тогда он будет запрашивать у Active Record,  а Controller будет работать с Service.
Repository даёт абстракцию над хранилищем, но я бы не использовал его с Yii2. Тоже очень неоднозначная штука, то что в Java почему-то называют Repository, на самом деле является просто DAO, при этом в .Net используют настоящие Repository.
Главное правило, если кода много и начинаете в нем теряться, нужно думать о том, как его разделить. Остальное с опытом!
В ларе юзай Eloquent - это и есть тот самый репозиторий. Некоторые умудряются создавать репозиторий для репозитория. Имхо, бред.
А всю логику держи в сервисах. Если просто, сервисы - это обычный класс, находящийся в папке app/Services. Не забывай ему неймспейс присваивать только, чтобы обращаться по имени.