Здравствуйте.
Учу примеры по книге YII2 for Beginners Bill Keck-a.
Пример из страницы 207.
Есть профиль юзера, на странице profile/view, в котором есть кнопка Update. Если у юзера User_type == "Paid" ему разрешается обновить профиль( User_type хранится в БД, ). Если "Free" то должно перекидовать на страницу upgrade/index.php.
Когда у юзера платный профиль( Paid ) то все работает нормально. При Free появляется ошибка.
Unknown Property – yii\base\UnknownPropertyException
Setting unknown property: yii\filters\AccessRule::0
in F:\OpenServer\domains\yii2build.lc\vendor\yiisoft\yii2\base\Component.php at line 197
Вот метод в контроллере Profile, отвечающий за Update
public function actionUpdate()
{
PermissionHelpers::requireUpgradeTo("Paid");
if( $model = Profile::find()->where(["user_id" => Yii::$app->user->identity->id])->one()){
if( $model->load( Yii::$app->request->post()) && $model->save()){
return $this->redirect(["view", 'id' => $model->id]);
}
else{
return $this->render("update", [
"model" => $model,
]);
}
}
else{
throw new NotFoundHttpException("No such profile");
}
// $model = $this->findModel($id);
}
PermissionHelpers. Как раз метод в этом классе перенаправляет на upgrade/index.
public static function requireUpgradeTo($user_type_name)
{
if (!ValueHelpers::userTypeMatch($user_type_name)) {
return Yii::$app->getResponse()->redirect(Url::to(['upgrade/index']));
}
}
ValueHelpers
public static function userTypeMatch($user_type_name)
{
$userHasUserTypeName = Yii::$app->user->identity->userType->user_type_name;
return $userHasUserTypeName == $user_type_name ? true : false;
}
А вот контроллер Upgrade
class UpgradeController extends \yii\web\Controller
{
public function behaviors()
{
return[
'access' => [
'class' => \yii\filters\AccessControl::className(),
'only' => ['index'],
'rules' => [
'actions' => ['index'],
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action){
return PermissionHelpers::requireStatus('Active');
}
]
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'delete' => ['post'],
]
]
];
}
public function actionIndex()
{
$name = Profile::find()->where(['user_id' => Yii::$app->user->identity->id])->one();
return $this->render('index', ['name' => $name]);
}
}
UPD1.
Возможно виноват UpgradeController/
Ведь, если вводит напрямую адрес
yii2build.lc/index.php?r=upgrade/index, то выходит та же самая ошибка.
UPD2.
Ответ в комментариях Dimon.