Trying to get property 'user_id' of non-object?

Имеется экшен, который должен удалять запись из БД.
Он принимает id записи, посланный методом post.
После вызова, возвращает ошибку, однако метод delete() срабатывает.
В чём ошибка?

/**
     * @return string
     *
     * Delete vacancy action
     */
    public function actionDelete()
    {

        /* @var $currentUser User */
        $currentUser = Yii::$app->user->identity;

        if(Yii::$app->user->isGuest || $currentUser->isUser()) {
            return $this->goHome();
        }

        $model = new Vacancy();

        Yii::$app->response->format = Response::FORMAT_JSON;

        // получаем id поста, на который пожаловались
        // по методу post
        $id = Yii::$app->request->post('id');

        // находим вакансию
        $vacancy = $model->getVacancyById($id);

        // на всякий случай, проверяем, является ли
        // пользователь автором вакансии
        if($currentUser->getId() != $vacancy->user_id ) {
            return $this->goHome();
        }

        if($vacancy->delete()) {
            return $this->redirect(Url::to(['/user/profile/view', 'id' => $currentUser->getId()]));
        }

        return [
            'success' => false,
            'text' => 'Error',
        ];
    }


Метод getVacancyById
/**
     * @param $id
     * @return array|null|\yii\db\ActiveRecord
     *
     * get vacancy by id
     */
    public function getVacancyById($id)
    {
        return $this->find()->where(['id' => $id])->one();
    }
  • Вопрос задан
  • 467 просмотров
Решения вопроса 3
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Trying to get property 'user_id' of non-object?

Вы пытаетесь обратиться к свойству объекта, но это не объект. Вероятно тут: $vacancy->user_id Скорее всего у Вас в $vacancy содержится null, и соответственно Вы пытаетесь сделать null->user_id Так что прежде чем обращаться к свойству стоит делать проверку, а объект ли в $vacancy или не равно ли оно null, а иногда и проверять инстанс какого именно класса в переменной.
Ответ написан
Комментировать
slo_nik
@slo_nik Куратор тега Yii
Добрый день.
return self::find()->where(['id' => $id])->one();
Ответ написан
kimono
@kimono
Web developer
// находим вакансию
$vacancy = $model->getVacancyById($id);

// здесь вы должны удостовериться, что вакансия по заданному ID найдена
// а вы сразу пытаетесь получить атрибут user_id, при том что $vacancy в тот момент может быть NULL

// на всякий случай, проверяем, является ли
// пользователь автором вакансии
if($currentUser->getId() != $vacancy->user_id ) {
    return $this->goHome();
}


PS: можно сделать так:
public function getVacancyById($id)
{
  $vacancy =  $this->find()->where(['id' => $id])->one();
  if (!$vacancy){
    throw new NotFoundHttpException('Вакансия не найдена');
  }
  return $vacancy;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы