Как Правильно Использовать Controllers И Views Для Авторизованных Пользователей И Нет

У меня в проекте есть система авторизации пользователей. И мне бы хотелось бы немного поменять логику для авторизованных пользователей и нет. На текущий момент я делаю такую проверку в самих контроллерах и представлениях:




public function actionIndex()

{

   if (Yii::app()->user->isGuest) {

     .

     .

     .   

   } else {

     .

     .

   }

}






<?php 

    if(Yii::app()->user->isGuest) {

        print("Welcome back Guest!");

        print("Your id is ".Yii::app()->user->id);

    } else {

        print("Welcome back ".Yii::app()->user->name);

        print("Your id is ".Yii::app()->user->id);

}?>



Мне кажется этот подход не очень правильным, поскольку здесь мешается все в кучу и если логика для авторизаванных пользователей и нет сильно разнится, что будет полная каша. Было бы здорово если бы можно было создавать базовые контроллеры и представления с общей логикой и от них унаследовать классы для авторизованных пользователей и нет. Что-то вроде этого:




class SiteController extends Controller

{

}


class AuthSiteController extends SiteController

{  

   $this->render('indexAuth');

}


class NoAuthSiteController extends SiteController

{  

  $this->render('indexNoauth');

}



Кто что думает об этом? Может в Yii есть что-то подобное?

Ну вот конкретно Ваш пример с AuthSiteController легко реализуется переопределением метода render в базовом контроллере.

К примеру, перехватывать название вьюхи и добавлять префикс ‘admin_’ если пользователь залогинен.

Соответственно, два набора вьюх.

Если требуется подменять контроллер в зависимости от залогиненности - я бы попробовал роутер допилить.

А вообще посмотрите еще на модули и accessFilter.

Вы это имеете в виду?:




class SiteController extends Controller

{

  $auth = Yii::app()->user->isGuest ? "Noauth" : "Auth";

  $this->render("index$auth");

}



Если так, то тоже вариант, поскольку так нужно делать в каждом роутере каждого контроллера.

Подскажите в каком месте пилить?

Не очень понял как в данном случае можно использовать модули?

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

Ну, роутер сделан как компонент, соответственно от него можно отнаследоваться или полностью подменить своим (в конфиге, по той же схеме, по которой CWebUser переопределяем).

Ну, это на случай, если потребуется полностью изменить пользовательскую часть.