styleroom
(Styleroom)
July 21, 2014, 9:41am
1
всем привет
народ, подскажите - как по-хитрому сделать правила доступа в модуле один раз,
чтобы не писать в каждом контроллере?
на первое время сделал так =
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;
}
}
ineersa
(Ineersa)
July 21, 2014, 11:11am
2
Наследуйте все контроллеры модуля от базового, в нем сделайте фильтр:
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();
}
}
....
}
Должно работать.
Или же просто напишите в родительском контроллере beforeAction и наследуйте его. Так будет еще проще.
mickgeek
(Olegbelostotsky)
August 12, 2014, 5:03pm
4
Согласен, проще, но я бы не рекомендовал использовать CController::beforeAction(), когда существуют более грамотные решения.
ineersa
(Ineersa)
August 13, 2014, 1:35pm
5
mickgeek:
Согласен, проще, но я бы не рекомендовал использовать CController::beforeAction(), когда существуют более грамотные решения.
А чем собственно вызвано такое недовольство beforeAction()?
mickgeek
(Olegbelostotsky)
August 14, 2014, 6:05pm
6
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'); },
),
);
}