Yii2请求PUT无法正常工作

时间:2016-05-17 07:29:11

标签: php yii2 yii2-advanced-app yii2-basic-app

我在yii2中使用了Authorization : Bearer的rest api,而我的update操作需要使用PUT发送数据。我已经完全配置了actionUpdate,但不知怎的,我没有在Request PUT中获取任何数据。

我在网上发现了一些关于Yii2 PUT问题的文章,但是找不到天气还有什么解决方案呢?

其中一篇文章或问题是github issue,它指向此github issue

广告,如果没有解决方案,我应该使用Update行动。

这是我的actionUpdate代码

public function actionUpdate($id)
{
    $params = Yii::$app->request->bodyParams;

    $model = Event::find()->where(['event_id'=>$id])->andWhere(['partner_id' => Yii::$app->user->id])->one();

    if($model !== null){

        $model->load($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);

        }
    }
 }

这是调试屏幕的屏幕截图。请参阅event_name属性。

enter image description here

这是执行$model->load($params,'')行后的截图。

我正在调用此服务,并且无法正确Update数据。我的服务通过邮递员工作得很好。所以我想我在CURL请求中遗漏了一些内容。

$service_url = 'http://localhost/site-api/api/web/v1/events/'.$eventDetailDBI->gv ('id');
            $curl = curl_init($service_url);
            $curl_post_data = array(
                "event_name" => $eventDetailDBI->gv ('name'),

            );

            $header = array();
            $header[] = 'Authorization: Bearer 4p9mj82PTl1BWSya7bfpU_Nm';
            $header[] = 'Content-Type: application/x-www-form-urlencoded';

            curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($curl, CURLOPT_HTTPHEADER,$header);
            curl_setopt($curl, CURLOPT_PUT, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $curl_post_data);
            $curl_response = curl_exec($curl);
            $json = json_decode($curl_response, true);
            curl_close($curl);

我在POST字段中获取了正确的数据并传递了正确的数据,但该服务并未更新任何数据。

谢谢

1 个答案:

答案 0 :(得分:1)

试试这个:

public function actionUpdate($id)
{
    // this will get what you did send as application/x-www-form-urlencoded params
    // note that if you are sending data as query params you can use Yii::$app->request->queryParams instead.
    $params = Yii::$app->request->bodyParams;

    $model = Event::find()->where(['event_id'=>$id])->andWhere(['partner_id' => Yii::$app->user->id])->one();

    if($model !== null){

        // This will load data to your safe attribute as defined in your model rules using your default scenario.
        $model->load($params, '');

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

        if ($model->save()) {

            /*
                you can use Yii::$app->getResponse()->setStatusCode(200) here but no need to do that. 
                response will be 200 by default as you are returning data.
            */

            // yii\rest\Serializer will take care here of encoding model's related attributes.
            return [
                'status' => 1,
                'data' => $model
            ];

        }
        else {
           // when validation fails. you model instance will hold error messages and response will be auto set to 422.
           return $model;
        }
    }
 }