Accessrules Для Модуля

всем привет

народ, подскажите - как по-хитрому сделать правила доступа в модуле один раз,

чтобы не писать в каждом контроллере?

на первое время сделал так =


public function beforeControllerAction($controller, $action)

{

    if(parent::beforeControllerAction($controller, $action))

    {

        if(Yii::app()->user->isGuest AND $action->id != 'login')

        {

            Yii::app()->controller->redirect(Yii::app()->controller->createURL('login'));

        }

        return true;

    }

    else

    {

        return false;

    }


}

Наследуйте все контроллеры модуля от базового, в нем сделайте фильтр:




class MyModuleController extends AController

{

.......

}

//в компонентах модуля

class AController extends CController

{

....

    public function filters()

    {

        return array(

            'myfilter', 

         );

    }

....

    public function myfilter($filterChain)

    {

        if(Yii::app()->user->isGuest AND Yii::app()->controller->action->id != 'login'){

            Yii::app()->controller->redirect(Yii::app()->controller->createURL('login'));

        } else {

            $filterChain->run();

        }

    }

....

}



Должно работать. :rolleyes:

Или же просто напишите в родительском контроллере beforeAction и наследуйте его. Так будет еще проще.

хорошие советы

сейчас попробую

Согласен, проще, но я бы не рекомендовал использовать CController::beforeAction(), когда существуют более грамотные решения.

А чем собственно вызвано такое недовольство beforeAction()? ::)

ineersa, нет-нет, никакого недовольства) На мой взгляд, плохой тон - писать функционал в неположенном ему месте. Приведу простой пример, шаблон MVC. Если есть желание, то можно обойтись и без модели или представления.

Я бы решил задачу автора темы примерно следующим образом (тоже с помощью базового контроллера):


public function accessRules()

{

	return array(

		array('allow',

			'controllers' => array('login'),

			'users' => array('*'),

		),

		array('allow',

			'controllers' => array('*'),

			'users' => array('@'),

		),

		array('deny',

			'users' => array('*'),

			'deniedCallback' => function() { Yii::app()->controller->redirect('login'); },

		),

	);

}