@dindilin
Programming

Почему модель выносится в контроллер?

Зачастую, смотря код других модулей, встречается такое что логика модели переносится в контроллер, например

public function actionAjaxSearch()
{
Yii::$app->response->format = Response::FORMAT_JSON;
$query = Post::find()
->select(['id', 'title'])
->andWhere(['like', 'title', Yii::$app->request->post('title')])
->limit(10);

if ($postType = Yii::$app->request->post('type')) {
$query->andWhere(['type' => $postType]);
}

return $query->all();
}

Ведь выборка из таблиц и все остальное должно проводиться в модели, для чего тогда модель встречается в контроллере почти повсеместно?
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 3
qonand
@qonand
Software Engineer
Логика построения запроса по хорошему должна быть в моделе, т.к. это часть бизнес-логики. Контроллер только должен обрабатывать пользовательский запрос и работать с классом бизнес логики. Так же некоторые аспекты формирования запросов можно выносить в ActiveQuery

P.S. не стоит забывать что модель в MVC и модель YII это разные понятия
Ответ написан
Комментировать
Subotinn
@Subotinn
Так быстрее.
Создайте отдельную функцию на получение всех нужных вам записей в каком-то mapper/repository/model, как будет угодно. И вызывайте только её из контроллера.

В итоге будет что-то из разряда:
public function actionAjaxSearch()
{
Yii::$app->response->format = Response::FORMAT_JSON;
return Post::findAllEntities(Yii::$app->request->post);
}


Если у вас обычный select из базы без всяких фильтраций и прочего, то зачем создавать лишние функции в моделях.
Ответ написан
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Встречается повсеместно и правильно - это два разных понятия.
По хорошему, для поиска делается отдельная модель, она унаследована от основной, в доках yii2 есть примеры, да и стандартный crud генерированный через gii так делает. Это правильно, это удобно, но при написании ручками - дольше. Видимо поэтому часто делают не так.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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