@evgeniy_matveev

Как грамотно написать метод в YII2?

Здравствуйте, я новичок в yii. Начал писать свой первый проект с минимальным ТЗ. Как и водится, в процессе ТЗ раздулось. В итоге получил четыре очень похожих метода:
"Индексный" метод
public function actionIndex(){
        $sort = new Sort([
            'attributes' => [
                'number' => [
                    'asc' => ['number' => SORT_ASC],
                    'desc' => ['number' => SORT_DESC],
                    'default' => SORT_ASC,
                    'label' => 'По номеру',
                ],
                'date' => [
                    'asc' => ['date' => SORT_ASC],
                    'desc' => ['date' => SORT_DESC],
                    'default' => SORT_ASC,
                    'label' => 'По дате',
                ],
            ],
        ]);
        $stat = Yii::$app->request->get('stat');
        if (!$stat){
            $stat='0';
        }
        $session = Yii::$app->session;
        $pageSize = Yii::$app->request->get('pagesize');
        if($pageSize){
            $session['pageSize'] = $pageSize;
        }
        $users = User::find()->all();
        $query = Projects::find()->where(['status'=>$stat])->with(['materials','design','installing','building'])->orderBy($sort->orders);

        $countQuery = clone $query;
        $pages = new Pagination([
            'totalCount'=>$countQuery->count(),
            'pageSize'=>$session['pageSize'],
            'forcePageParam'=>false,
            'pageSizeParam'=>false,
            'defaultPageSize'=>10]);
        $status = $query->offset($pages->offset)
            ->limit($pages->limit)
            ->all();
        return $this->render('index', [
            'status' => $status,
            'pages'=>$pages,
            'users'=>$users,
            'sort' => $sort
        ]);
    }

Метод для поиска:
public function actionSearch(){
        $sort = new Sort([
            'attributes' => [
                'number' => [
                    'asc' => ['number' => SORT_ASC],
                    'desc' => ['number' => SORT_DESC],
                    'default' => SORT_ASC,
                    'label' => 'По номеру',
                ],
                'date' => [
                    'asc' => ['date' => SORT_ASC],
                    'desc' => ['date' => SORT_DESC],
                    'default' => SORT_ASC,
                    'label' => 'По дате',
                ],
            ],
        ]);
        $stat = Yii::$app->request->get('stat');
        if (!$stat){
            $stat='0';
        }
        $session = Yii::$app->session;
        $pageSize = Yii::$app->request->get('pagesize');
        if($pageSize){
            $session['pageSize'] = $pageSize;
        }
        $users = User::find()->all();
        $search = Yii::$app->request->get('search');
        $query = Projects::find()
            ->Where(['status'=>$stat])
            ->joinWith('materials')
            ->andWhere([
                'or',
                ['like','materials.number',$search],
                ['like','materials.description',$search],
                ['like','projects.number',$search]
            ])
            ->with(['materials','design','installing','building'])
            ->distinct()
            ->orderBy($sort->orders);
        /*$countQuery = clone $query;*/
        $pages = new Pagination(['totalCount'=>$query->count(),'pageSize'=>$session['pageSize'],'forcePageParam'=>false,'pageSizeParam'=>false,'defaultPageSize'=>10]);

        $status = $query->offset($pages->offset)
            ->limit($pages->limit)
            ->all();
        return $this->render('index', [
            'status' => $status,
            'pages'=>$pages,
            'users'=>$users,
            'search'=>$search,
            'sort'=>$sort
        ]);
    }

Собственно, идеологию разделения методов по поиску черпнул из модуля CRUD. Но, во-первых, получилось очень много копипаста.
А во-вторых, есть проблема с вызовом этих методов из view.
Отсюда два вопроса:
1. Как объединить эти методы?
2. В случае, если не объединять методы.
Для сортировки используется вот такая конструкция:
$sort = new Sort([
            'attributes' => [
                'number' => [
                    'asc' => ['number' => SORT_ASC],
                    'desc' => ['number' => SORT_DESC],
                    'default' => SORT_ASC,
                    'label' => 'По номеру',
                ],
                'date' => [
                    'asc' => ['date' => SORT_ASC],
                    'desc' => ['date' => SORT_DESC],
                    'default' => SORT_ASC,
                    'label' => 'По дате',
                ],
            ],
        ]);

А во view всего-то достаточно
<?php echo $sort->link('number')?> и эта ссылка будет работать для всех методов. Как такую же конструкцию сделать для пагинации? Дело в том, что Pagination() не имеет в себе attributes.
  • Вопрос задан
  • 155 просмотров
Пригласить эксперта
Ответы на вопрос 1
@abdujabbor1987
Самое первое наверно вам стоит перенести всю логику которую вы написали на контоллере на уровень модели, потом уже попробовать DRY принцип
Ответ написан
Ваш ответ на вопрос

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

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