MVC

Народ, подскажите, вот есть такая проблема:

По нажатию на кнопку происходит много действий, изза чего код экшна контроллера сильно раздувается. В Yii нет реализованного уровня сервиса по умолчанию (уровень-прослойка между Контроллером и Моделью).

В контроллере у меня допустим происходит обработка нажатий кнопки, обращение к разным моделям, загрузка новостей из гугла? поделитесь своим стилем написания плизз

тут напрашивается выносить часть функционала за пределы контроллера? Для этой цели я думаю создать каталог protected/services - и туда выносить функционал. Сервис должен вызываться из логики, а уже модель - из сервиса.

А как вы делаете? что если очень много кода должно быть выполнено в экшне? как вы решаете эту проблему. Спасибо!

Тут очень много вариантов все зависит от конкретного проекта, его архитектуры и задач… так никто точного ответа не даст.

у примеру можно использовать виджеты. можно же какие-то методы делать приватными к которым обращаться из разных экшенов или видов, но это в пределах одного контроллера.

можно писать расширения к которым уже можно иметь доступ из разных контроллеров…

В общем все сильно зависит от выбранной архитектуры.

По моему мнению вы совершенно правильно думаете!

у меня такие сервисы называются менеджерами, хотя это сути не меняет…

Такой менеджер(сервис) в моем понимании это фасад над прослойкой данных (моделями), причем это не обязательно должны быть модели AR…

например:

есть сервис NewsManager, в нем есть методы:

getNewsById

getNewsListForUser

getNewsListNotApproved

getLastNews

updateNews

etc.

эти методы могут как работать с моделью AR, так брать данные из sphinx, xml, кэша или чего то ещё.

все что объединяет эти методы, так то что они работают с сущностью новостей.

т.е. контроллер, обращаясь к сервису, знает только то что он хочет получить, а вот как именно эти данные будут сформированы он не знает и не должен.