在 rest api yii2 上重写 POST 方法
rewrite POST method on rest api yii2
我必须在 rest yii2 上重写 post 请求。
每次我 post 请求 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);
}
有什么想法吗?
在外部添加 url 规则,如下所示。
'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'],
这为客户打开了许多 url。
[
'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',
]
以上所有 url 将为客户开放。
所以...
有两种方法可以覆盖 post.
第一个@Irfan Ali 方法
此方法允许在 main.php 中声明单个调用并在控制器中使用单个函数。
第二种方法是
在 main.php 中声明对可用性的一般调用
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
[
'class' => 'yii\rest\UrlRule',
'controller' => ['v1/availability'],
'pluralize' => true,
],
],
],
对于拦截 post 方法,您必须在控制器中重写
public function createAction($id){
throw new \yii\web\HttpException(200, 'You receive post or put', 200);
}
并且在这个函数中你必须拦截如果调用是post你做任何事情。
我喜欢第一种方法!
我必须在 rest yii2 上重写 post 请求。 每次我 post 请求 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);
}
有什么想法吗?
在外部添加 url 规则,如下所示。
'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'],
这为客户打开了许多 url。
[
'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',
]
以上所有 url 将为客户开放。
所以... 有两种方法可以覆盖 post.
第一个@Irfan Ali 方法 此方法允许在 main.php 中声明单个调用并在控制器中使用单个函数。
第二种方法是 在 main.php 中声明对可用性的一般调用
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
[
'class' => 'yii\rest\UrlRule',
'controller' => ['v1/availability'],
'pluralize' => true,
],
],
],
对于拦截 post 方法,您必须在控制器中重写
public function createAction($id){
throw new \yii\web\HttpException(200, 'You receive post or put', 200);
}
并且在这个函数中你必须拦截如果调用是post你做任何事情。
我喜欢第一种方法!