在rest api yii2上重写POST方法

时间:2017-04-13 16:41:06

标签: rest api yii yii2 yii2-api

我必须在休息时更改帖子请求yii2。 每当我在url v1 / availability上发布请求时 我想调用actionCreate来管理请求。

这是我的main.php

'urlManager' => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => true,
            'showScriptName' => false,
            'rules' => [
                [
                    'class' => 'yii\rest\UrlRule',
                    'controller' => ['v1/availability'],
                    'pluralize' => true,
                    'extraPatterns' => [
                        'POST v1/availability' =>   'v1/availability/create'
                    ]
                ],
                'OPTIONS v1/user/login' => 'v1/user/login',
                'POST v1/user/login' => 'v1/user/login',
                'POST v2/user/login' => 'v2/user/login',
                'OPTIONS v2/user/login' => 'v2/user/login',
            ],
        ],

在v1 / controllers / AvailabilityController.php中 我'已经

public function actions()
    {
        $actions = parent::actions();
        unset($actions['view']);
        return array_merge(
            $actions,
            [
                'index' => [
                    'class' => 'yii\rest\IndexAction',
                    'modelClass' => $this->modelClass,
                    'checkAccess' => [$this, 'checkAccess'],
                    'prepareDataProvider' => [$this, 'index']
                ],
            ]
        );
    }

public function actionCreate(){
        throw new \yii\web\HttpException(200, 'IT WORKS!', 200);
    }

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

在下面添加网址规则。

'urlManager' => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => true,
            'showScriptName' => false,
            'rules' => [
                [
                    'class' => 'yii\rest\UrlRule',
                    'controller' => ['v1/availability']
                ],
                'POST v1/availability' =>   'v1/availability/create',
                'OPTIONS v1/user/login' => 'v1/user/login',
                'POST v1/user/login' => 'v1/user/login',
                'POST v2/user/login' => 'v2/user/login',
                'OPTIONS v2/user/login' => 'v2/user/login',
            ],
        ],

在这里你需要了解Yii的规则。如果你添加一个如下规则。

['class' => 'yii\rest\UrlRule', 'controller' => 'user'],

这为客户打开了许多网址。

[
    'PUT,PATCH users/<id>' => 'user/update',
    'DELETE users/<id>' => 'user/delete',
    'GET,HEAD users/<id>' => 'user/view',
    'POST users' => 'user/create',
    'GET,HEAD users' => 'user/index',
    'users/<id>' => 'user/options',
    'users' => 'user/options',
]

以上所有网址都将为客户开放。

答案 1 :(得分:0)

所以... 有2种方法来覆盖帖子。

首先是@Irfan Ali方法 此方法允许在main.php中声明单个调用,并在控制器中使用单个函数。

第二种方法是 在main.php中声明对可用性的一般调用

'urlManager' => [
        'enablePrettyUrl' => true,
        'enableStrictParsing' => true,
        'showScriptName' => false,
        'rules' => [
            [
                'class' => 'yii\rest\UrlRule',
                'controller' => ['v1/availability'],
                'pluralize' => true,
            ],
        ],
    ],

对于拦截后方法,您必须在控制器中覆盖

public function createAction($id){
    throw new \yii\web\HttpException(200, 'You receive post or put', 200);
}

并且在此功能中,如果您发布任何呼叫,则必须拦截。

我喜欢第一种方法!