@serikd

Как лучше реализовывать actions в контроллерах фреймворков или widgets?

Здравствуйте.
Как лучше реализовать такое - к примеру у нас страница, на которой у нас есть топ новость (наверху), список текущих новостей (середина) и внизу архивные новости, справа лента комментариев?

В конкретном случае я работаю с Yii2 фреймворком, топ и комментарии реализовал виджетами, а листинг новостей в экшене контроллера.
Сейчас нужно реализовать низ - архивные новости и я думаю как будет лучше сделать, виджетом или дописывать в экшене котроллера.
Как такое реализовывается например на других фреймворках, где нет виджетов как в Yii2?
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 1
rpsv
@rpsv
делай либо хорошо, либо никак
Виджеты - просто выводят данные, которые им кинул контроллер. По своей сути виджеты - это представления (MVC). То есть в действии (action) контроллере, вы только подготавливаете данные (model) для представления.

Если говорить конкретно про вашу задачу и немного ООП: вам нужно реализовать 2 базовых виджета:
- список новостей - принимает на вход DataProvider с новостями
- список комментариев - принимает на вход DataProvider с комментариями

А затем наследоваться от виджета "список новостей" и сделать еще парочку:
- список топовых новостей
- список архивных новостей

Код будет выглядеть примерно так (абстрактно):
/*
список новостей
*/
class ListNews extends ListView {}

/*
список топовых новостей
*/
class ListTopNews extends ListNews
{
    public function init()
    {
        // создаете провайдер с топовыми новостями
        $this->dataProvider = new ActiveDataProvider(...);
        parent::init();
    }
}


Ну и так далее по аналогии. Таким образов ваши новости (любые) буду одинаково выглядеть (ну с учетом одинакового представления), и вы сможете легко плодить нужные вам типы списков новостей.

Вам просто нужно понять, что представления (view) могут (а точнее должны), напрямую брать данные из модели (model). Если говорить про Yii, контроллер в данном случае просто передает данные в представление (что на самом деле слегка нарушает MVC).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы