Обновление API-интерфейса Yii2 выдает ошибку преобразования объекта

Я работаю с Yii2 REST api и использую Authorisation : Bearer для аутентификации.

У меня есть модель Event и только 2 действия Create и Update, но мое действие Update не работает нормально и выдает ошибку преобразования класса объекта.

Я использую следующий код для поиска модели Event со смешанными условиями.

public function actionUpdate($id)
{
    $params=$_REQUEST;
    /*Following line throws error */
    $model = Event::find()->where(['event_id'=>$id])->andWhere(['partner_id'=> Yii::$app->user->identity]);

    if($model !== null){

        $model->attributes=$params;
        $model->partner_id = Yii::$app->user->id;
        $model->updated_date = time();

        if ($model->save()) {

            $this->setHeader(200);
            echo json_encode(array('status'=>1,'data'=>array_filter($model->attributes)),JSON_PRETTY_PRINT);

        }

    }

}

Ошибка примерно такая

Объект класса api\modules\v1\models\User не может быть преобразован в строку

Я не могу понять, почему он говорит, что я создал объект класса User.


person Mike Ross    schedule 17.05.2016    source источник


Ответы (3)


Yii::$app->user->identity

это объект, который вы должны использовать

Yii::$app->user->identity->id

поэтому последняя строка будет:

$model = Event::find()->where(['event_id'=>$id])->andWhere(['partner_id'=> Yii::$app->user->identity->id]);
person Chetan Sharma    schedule 17.05.2016

Проблема с вашим andWhere(), вы пытаетесь назначить partner_id object, а именно. Yii::$app->user->identity, так что здесь ваш код неисправен. И не используйте json_encode, когда вы можете использовать формат ответа Yii Response::FORMAT_JSON, поэтому ваш код будет выглядеть так:

public function actionUpdate($id)
{
    \Yii::$app->response->format = yii\web\Response::FORMAT_JSON; // formatting response in json format
    $params= json_decode(\Yii::$app->request->rawBody, 1);
    /*Following line throws error */
    $model = Event::find()->where(['event_id'=>$id])->andWhere(['partner_id'=> Yii::$app->user->identity->id]);

    if($model !== null){

        $model->attributes=$params;
        $model->partner_id = Yii::$app->user->id;
        $model->updated_date = time();

        if ($model->save()) {

            $this->setHeader(200);
            return array('status'=>1,'data'=> $model); // you can simply use $model

        }

    }

}
person Sagar Guhe    schedule 17.05.2016
comment
спасибо за ваше время, но это не моя проблема в данный момент. - person Mike Ross; 17.05.2016
comment
Я думаю, что проблема в вашем andWhere() состоянии. Вы использовали Yii::$app->user->identity, где identity — это полный объект, содержащий данные о вошедшем в систему пользователе. Так и должно быть Yii::$app->user->identity->anyAttributeFromUserTable - person Sagar Guhe; 17.05.2016
comment
я думаю, что это была проблема, но с действием обновления у меня возникла проблема с запросом PUT и PATCH. Кажется, я не получаю никаких данных, отправленных через запрос PUT. - person Mike Ross; 17.05.2016
comment
Вы не должны использовать $_REQUEST, так как $_REQUEST возвращает только данные GET, POST, COOKIE. Поскольку вы используете запросы PUT или PATCH, я предполагаю, что вы используете JSON в качестве тела запроса, поэтому вам следует использовать `\Yii::$app-›request-›rawBody`. - person Sagar Guhe; 17.05.2016

Проблема здесь:

andWhere(['partner_id'=> Yii::$app->user->identity])

Вы пытаетесь преобразовать пользовательский объект (Yii::$app->user->identity) в строку. Вместо этого вам нужно использовать идентификатор пользователя (Yii::$app->user->identity->id), который представляет собой строку.

person Bryant Jackson    schedule 17.12.2016