Express777
@Express777

Ошибка при апгрейде профиля Setting unknown property: yii\filters\AccessRule::0?

Здравствуйте.
Учу примеры по книге 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.
  • Вопрос задан
  • 2091 просмотр
Решения вопроса 1
@Glimor
develop
public function actionUpdate()   {
        PermissionHelpers::requireUpgradeTo("Paid");
}
надо эту конструкцию обернуть в if( PermissionHelpers::requireUpgradeTo("Paid")) { }
в твоем случае это метод возвращает true/false, который не на что не влияет

попробуй так
public function behaviors()
    {
        return[
            'access' => [
                'class' => \yii\filters\AccessControl::className(),
                'only' => ['index', 'update'],
                'rules' => [
                    'actions' => ['index', 'update'],
                    'allow' => true,
                    'roles' => ['@'],
                    'matchCallback' => function ($rule, $action){
                        return PermissionHelpers::requireStatus('Active') && PermissionHelpers::requireUpgradeTo("Paid") ;
                    }
                ]
            ],
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['post'],
                ]
            ]
        ];
    }


а из экшена PermissionHelpers::requireUpgradeTo("Paid") убери
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы