2017-04-13 78 views
0

我必须重写休息yii2的post请求。 每次我对url v1/availability 发布请求时,我都想要为action请求调用actionCreate。重写休息api的POST方法yii2

这是我的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 /控制器/ 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); 
    } 

任何想法?

回答

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', 
] 

以上所有网址都会向客户开放。

0

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

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

第二种方法是在 声明main.php用于拦截POST方法而定

'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); 
} 

覆盖,并在此功能,您必须截取如果通话是发布你做任何事情。

我爱第一方法!