vitovt
@vitovt

Как сделать контроллер тонким?

Переписываю один проект на Yii2 и много чего хочется вынести в модели. Притом вынести так, чтобы модель отдавала некий набор данных (массив или dataProvider) а контрлллер не знал нчиего про это )
В общем пытаюсь написать токний контроллер и толстую модель и не понимаю как лучше сделать, мечусь между несколькими реализациями.

Вообще ткните пальцев самый классный пример реализации поиска, выборки и вывода записей из БД.

1. Использовать SearchModel и метод search() в котором возвращать dataProvider, а в контроллере передавать

$items = SearchModel->search();

2. Не использовать dataProvider в метод search а просто в контроллере писать что-то вроде

$items = SearchModel::fund()->limit(...)->offset(..)->all();


и тут же определять $pages и передавать все это в вью.

Как пример одного туториала:

function actionIndex()
{
    $query = Article::find()->where(['status' => 1]);
    $countQuery = clone $query;
    $pages = new Pagination(['totalCount' => $countQuery->count()]);
    $models = $query->offset($pages->offset)
        ->limit($pages->limit)
        ->all();

    return $this->render('index', [
         'models' => $models,
         'pages' => $pages,
    ]);
}


3. Смешать два варианта:
в модели сделать
public static function find()
    {
        return \Yii::createObject(SomeQuery::className(), [get_called_class()]);
    }


Затем написать SomeQuery с методом, например,

public function byFilter( $params ) {
if ( $params ) {
            foreach ( $params as $k => $v ) {
                if( trim($v)!='') {
                    switch ( $k ) {

                        case 'user_id' : {
                            $this->andWhere(['user_id' => intval( $v )]);
                        } break;

......
 }


Затем уже в контроллере просто вызывать

$query = SearchModel::find()->byFilter(\Yii::$app->request->queryParams)->all();


Не понимаю как лучше\правильнее\потом легче поддерживать. Хочется сделать универсально, чтобы при росте нагрузок и изменении прицнипа выборки из БД контроллер вообще бы не трогать, а менять и оптимизировать только модель.

Спасибо =)
  • Вопрос задан
  • 289 просмотров
Пригласить эксперта
Ответы на вопрос 2
@AlexKuznec
Не совсем понял что нужно, но в генераторе моделей Gii галочка "Generate ActiveQuery" не для вашего случая?
Ответ написан
qonand
@qonand
Software Engineer
Построение запросов к базе данных в контроллере - это грубейшее нарушение принципов MVC. Задача контроллера - обработать запрос пользователя и сформировать ответ на него. Никакой бизнес-логики, выборок и прочего в контроллере быть не должно. Поэтому однозначно лучше использовать SearchModel

пару статей Вам в помощь:
https://habrahabr.ru/post/321050/
https://habrahabr.ru/post/322700/
Ответ написан
Ваш ответ на вопрос

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

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