@AlexWeb6667
Web-дизайнер с опытом FullStack разработки

Как делать рендер в модели, и вообще правильно ли это?

Всем привет, вопрос по архитектуре сайта, стал о ней задумываться только после того как контроллер стал похож на документацию к yii, ну объемом в смысле. Сайт на AJAX, и есть в нем такая логика
//  Моя страничка
    public function actionIndex()
    {

        //Если пришел AJAX запрос
        if (Yii::$app->request->isAjax) {

                    //Если пришел id
                    if (Yii::$app->request->post('id')) {
                        $id = Yii::$app->request->post('id');

                        //Обо мне с сайдбара
                        if ($id == 11) {

                            //Шаблон контента, без сайдбара
                            $this->layout = 'admin_content_ajx';

                            return $this->render('index');
                        }

                        //Личная информация (телефон, емаил)
                        //Рендер только нижней части
                        if ($id == 1) {

                            return $this->renderAjax('index');
                        }

                        //Мои товары
                        if ($id == 2) {

                            $query = Product::find()->with('image')->orderBy(['id' => SORT_DESC]);

                            $pages = new Pagination([
                                'totalCount' => $query->count(), 'pageSize' => 5,
                                'forcePageParam' => false, 'pageSizeParam' => false,
                                'route' => 'admin/feed/my-products'
                            ]);
                            $products = $query->offset($pages->offset)->limit($pages->limit)->all();
                            return $this->renderAjax('my_products',compact('products','pages'));
                        }

                        //Мои сообщения
                        if ($id == 3) {

                            return $this->renderAjax('message');
                        }

                    }

                    //Если ничего из этого, отменить запрос
                    return false;

                }

        //Рендер всей странички Обо мне
        return $this->render('index');
    }


И она почти в каждом екшене. Может я изначально все не правильно распланировал(По велосипедному) менять уже поздновато, но если кто даст годные советы по архитектуре AJAX сайта, буду благодарен.

Так вот главный вопрос, я подумал может вынести ajax логику в модель?
//Если пришел AJAX запрос
        if (Yii::$app->request->isAjax) {

                    //Если пришел id
                    if (Yii::$app->request->post('id')) {
                        $id = Yii::$app->request->post('id');

                        //Обо мне с сайдбара
                        if ($id == 11) {

                            //Шаблон контента, без сайдбара
                            $this->layout = 'admin_content_ajx';

                            return $this->render('index');
                        }

                        //Личная информация (телефон, емаил)
                        //Рендер только нижней части
                        if ($id == 1) {

                            return $this->renderAjax('index');
                        }

                        //Мои товары
                        if ($id == 2) {

                            $query = Product::find()->with('image')->orderBy(['id' => SORT_DESC]);

                            $pages = new Pagination([
                                'totalCount' => $query->count(), 'pageSize' => 5,
                                'forcePageParam' => false, 'pageSizeParam' => false,
                                'route' => 'admin/feed/my-products'
                            ]);
                            $products = $query->offset($pages->offset)->limit($pages->limit)->all();
                            return $this->renderAjax('my_products',compact('products','pages'));
                        }

                        //Мои сообщения
                        if ($id == 3) {

                            return $this->renderAjax('message');
                        }

                    }

                    //Если ничего из этого, отменить запрос
                    return false;

                }


Пробовал, вроде все норм, но вот вопрос, как сделать рендер из модели? И вообще правильно ли это?
class AdminNavigation extends Model
{

    public $nav_page = 1;
    
    public function __construct($number)
    {
        $this->nav_page = $number;
    }


    public function OwmNav() {
        
        if ($this->nav_page == 1) {

            return $this->render("index");;
        }

        if ($this->nav_page == 2) {
            return $this->renderAjax("index");
        }


    }


}


Что в $this передать если рендер в модели идет?
  • Вопрос задан
  • 209 просмотров
Решения вопроса 2
qonand
@qonand
Software Engineer
Пробовал, вроде все норм, но вот вопрос, как сделать рендер из модели? И вообще правильно ли это?

Не правильно, это противоречит принципам MVC на основе который построен фрейморк
стал о ней задумываться только после того как контроллер стал похож на документацию к yii, ну объемом в смысле

Уж извините, но у Вас в контроллерах говнокод. У Вас один экшен отвечает за кучу вешений в зависимости от каких-то условий. Разделите код на отдельные экшены, что бы каждый из них отвечал только за свое
Ответ написан
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Как делать рендер в модели, и вообще правильно ли это?

нет, так делать нельзя, как и нельзя делать то что Вы наворотили в контролере. Зачем у Вас все в 1 экшене? Я бы вообще вынес ajax запросы в отдельный контролер. А на разные экшены раздробить точно надо.
Если по какой-то волшебной причине нужно все в один экшен засунуть, хотя я не представляю этого, то как минимум функции можно поделать типа
public function actionIndex($some_id){
  switch($some_id){
   case 1:
     $rend = $this->getSomeOne();
     break;
   case 2: 
     $rend = $this->getSomeTwo();
     break;
   default: 
     throw new \yii\web\HttpException(404, 'The requested Item could not be found.');
  }
  return $rend;
}

public function getSomeOne(){
   if($model = Some::find()->all())
      return $this->renderAjax('_some_one',['model'=>$model]);
   throw new \yii\web\HttpException(404, 'The requested Item could not be found.');
}

Хотя бы так, хотя я бы все же делал разные экшены и возможно раскидывал по разным контролерам
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы