Почему бы не сделать поддержку параметров для IWebUser::checkAccess($itemName, $params) в фильтре контроллера accessRules?
Ничего не сломается, если применить такие изменения:
Код: Выделить всё
class CAccessControlFilter extends CFilter
{
/**
* @param array $rules list of access rules.
*/
public function setRules($rules)
{
foreach($rules as $rule)
{
if(is_array($rule) && isset($rule[0]))
{
$r=new CAccessRule;
$r->allow=$rule[0]==='allow';
foreach(array_slice($rule,1) as $name=>$value)
{
if($name==='expression' || $name==='roles' || $name==='message' || $name === 'params')
$r->$name=$value;
else
$r->$name=array_map('strtolower',$value);
}
$this->_rules[]=$r;
}
}
}
....
}
class CAccessRule extends CComponent
{
....
/**
* @var array Дополнительные параметры для проверки доступа по ролям {@link IWebUser::checkAccess()}
*/
public $params = array();
....
/**
* @param IWebUser $user the user object
* @return boolean whether the rule applies to the role
*/
protected function isRoleMatched($user)
{
if(empty($this->roles))
return true;
foreach($this->roles as $role)
{
if($user->checkAccess($role, $this->params))
return true;
}
return false;
}
....
}
Я понимаю, что можно написать фильтр. Но иногда проще сделать:
Код: Выделить всё
class PostController extends CController
{
/**
* @var Post Сохранённая модель
*/
private $_model = null;
/**
* Фильтры действий
*
* @return array Фильтры действий
*/
public function filters()
{
return array
(
//контроль по ролям
'accessControl',
);
}
/**
* Базовые правила доступа к страницам
*
* @return array
*/
public function accessRules()
{
return array
(
//просмотр
array
(
'allow',
'actions' => array('view', 'index'),
'users' => array('*'),
),
//создание
array
(
'allow',
'actions' => array('create'),
'users' => array('@'),
'roles' => array('admin', 'createPost'),
),
//редактирование
array
(
'allow',
'actions' => array('update'),
'users' => array('@'),
'roles' => array('admin', 'updatePost'),
'params' => $this->getAction()->getId() === 'update' ? array('model' => $this->loadModel()) : array(),
),
//удаление
array
(
'allow',
'actions' => array('delete'),
'users' => array('@'),
'roles' => array('admin', 'deletePost'),
'params' => $this->getAction()->getId() === 'delete' ? array('model' => $this->loadModel()) : array(),
),
//остальное запретить всем
array
(
'deny',
'users' => array('*'),
),
);
}
....
}
Может быть, уже обсуждалось.