在我的行为中,我指定actionList
只能由经过身份验证的用户查看。
$behaviors [ 'access' ] = [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => [ 'list' ],
'allow' => ['@'],
]
],
];
在actionList
中,我得到了user_id
:
public function actionList() {
$user_id = Yii::$app->user->identity->id;
return $this->render( 'list' );
}
一切都很好,但如果你在未登录时执行此操作,你会收到一个错误:
PHP通知–yii\base\ErrorException
正在尝试获取非对象的属性
有道理,我没有登录,所以我没有用户id,但为什么代码会走那么远?如果我把$user_id = Yii::$app->user->identity->id;
注释掉,我会被重定向到登录页面,这是预期的行为。我认为我不应该再做一次检查,看看是否有人登录了操作本身,这不应该事先由behaviours['access']
处理吗?
尝试更改allow
和roles
属性:
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['list'],
'allow' => true,
'roles' => ['@'],
],
], // rules
], // access
];
}
点击此处了解更多信息。
这是我对上面已经很好的答案的评价
将以下代码添加到项目中的主控制器文件中(不是基本控制器),但在此之上的一些控制器是其他控制器的基础
/**
* Check if user is logged in and not logged out
*
* @param type $action
* @return type
*/
public function beforeAction($action) {
$this->enableCsrfValidation = false;
if(!empty($action) && $action->actionMethod == 'actionLogin') {
return true;
}
/* Check User's Login Status */
if (is_null(Yii::$app->user->identity)) {
$this->redirect(Url::to(['../site/login']));
Yii::$app->end();
}
return true;
}