SiZE писал(а):Запросы как минимум надо убрать в модель.
Думаю, что Вы имели в виду ActiveQuery, думая, что это тоже "модель". Репозитории в обиходе пока не прижились, а вот понятие "модель" обсудить стоит.
SiZE писал(а):Модель выполняет логику обмена данными с бд и логику приложения. На зарубежном форуме Й много раз это подтверждали в ответах и сами разработчики.
Вот с такой проталкиваемой разработчиками фреймворка предпосылки всё и идёт. Этим и укореняется в сообществе сужающее кругозор псевдопонимание, что Модель = ActiveRecord (или, в крайнем случае, экземпляр класса Model). И так уж сложилось, что ActiveRecord (в угоду упрощения, воспеваемого как основная концепция фреймворка) наследуется от Model, что позволяет обходиться лишь одним классом для всего кода.
Отсутствие явного обозначения единой номенклатуры в документации приводит к непониманию, когда здравый посыл "бизнес-логика должна быть в модели" именно внутри мира Yii новички трактуют не так, как хотелось говорящему. А именно под словом "модель" они буквально понимают именно класс ActiveRecord и всё пихают туда. Такая неоднозначность возникает из-за, извиниюяь за тавтологию, неоднозначности термина "модель".
Реальная же "модель" предметной области чаще представляет собой всю совокупность сущностей, вспомогательных объектов, сервисов, обработчиков событий и кучи всего такого прочего. А фреймворк же, в свою очередь, должен с помощью контроллеров и компонентов только предоставить удобную инфраструктуру по маршрутизации, обработке запросов, по работе с базой, отправке писем, записи логов. То есть инкапсулируя всё эти нюансы обеспечить все взаимодействия нашего приложения со внешним миром.
Вот есть компонент Yii::$app->cache. Код его спокойно использует. И при этом нашей системе вообще не важно, куда он там пишет и откуда считывает: в файлы ли, в Memcache, в базу. Так и модель должна лишь делать своё дело, при этом никак не выполняя логику обмена данными с БД. Это не ей решать. Сохранять её или искать должны другие "люди".
А на практике часто что-то мешает. Думается, что пропиши правила преобразований значений из базы где-нибудь в конфиге и всё заработает из коробки. Но изначально ActiveRecord не имеет хоть как-то настраиваемого маппинга. В итоге все данные из базы и обратно попадают как есть, из за чего постоянная возня с возвратом строк вместо чисел и с преобразованием даты из timestamp в строку для DatePicker и обратно. Приходится на ровном месте костылить это в afterFind() и beforeSave().
А извечный вопрос "Толстые контроллеры или толстые модели?" не иссякнет никогда. Практически всегда ученикам говорю, что мало кто знает такую "страшную" тайну, что помимо контроллеров и "моделей" можно создавать и другие (!) классы. И это для многих уже шок, не говоря ещё о принципах написания тестируемого и поддерживаемого кода, инкапсуляции, единой ответственности, объектно-ориентированной парадигмы в общем и мышления на уровне интерфейсов в частности. Но это уже совсем другая история...