Php 如何在Yii2高级模板中发布操作restapi
我有个问题想问你们:)我正试图在我的yii2高级模板上添加一个API,因为我想让我的wordpress网站向我的yii2应用程序发送数据。 我的系统:1)Yii2高级模板2)wordpress网站3)我的wordpress插件与vuejs和axios通过API在我的Yii2应用程序中创建新条目 所以我allready做了: common/config/main.php(当我使用AccessController时,我添加了orders/*以允许它) frontend/config/main.phpPhp 如何在Yii2高级模板中发布操作restapi,php,api,vue.js,yii2,yii2-advanced-app,Php,Api,Vue.js,Yii2,Yii2 Advanced App,我有个问题想问你们:)我正试图在我的yii2高级模板上添加一个API,因为我想让我的wordpress网站向我的yii2应用程序发送数据。 我的系统:1)Yii2高级模板2)wordpress网站3)我的wordpress插件与vuejs和axios通过API在我的Yii2应用程序中创建新条目 所以我allready做了: common/config/main.php(当我使用AccessController时,我添加了orders/*以允许它) frontend/config/main.php
'components' => [
'request' => [
'parsers' => [
'application/json' => 'yii\web\JsonParser',
],
和(在urlManager数组中)
然后我的控制器:
<?php
namespace frontend\controllers;
use yii\rest\ActiveController; use yii\filters\auth\HttpBasicAuth;
class OrdersController extends ActiveController {
public $modelClass = 'common\models\Vctorders';
public function behaviors()
{
$behaviors = parent::behaviors();
// remove authentication filter
$auth = $behaviors['authenticator'];
unset($behaviors['authenticator']);
// add CORS filter
$behaviors['corsFilter'] = [
'class' => \yii\filters\Cors::className(),
];
// re-add authentication filter
$behaviors['authenticator'] = $auth;
// avoid authentication on CORS-pre-flight requests (HTTP OPTIONS method)
$behaviors['authenticator']['except'] = ['options'];
return $behaviors;
}
public function actions()
{
$actions = parent::actions();
unset($actions['create']);
unset($actions['update']);
unset($actions['delete']);
unset($actions['view']);
//unset($actions['index']);
return $actions;
}
protected function verbs(){
return [
'create' => ['POST'],
'new' => ['POST'],
'update' => ['PUT', 'PATCH','POST'],
'delete' => ['DELETE'],
'view' => ['GET'],
//'index'=>['GET'],
];
}
public function actionCreate()
{
$model = new Vctorders();
$model->date_creation = date('Y-m-d H:i:s',strtotime('now'));
$model->etat = 0;
if($model->save()){
return 'OK';
} else{
return 'error';
}
}
}
答案是
{"name":"Exception","message":"Class 'frontend\\controllers\\Vctorders' not found","code":0,"type":"Error","file":"/Applications/MAMP/htdocs/SD/sdms/frontend/controllers/OrdersController.php","line":58,"stack-trace":["#0 [internal function]: frontend\\controllers\\OrdersController->actionCreate()","#1 /Applications/MAMP/htdocs/SD/sdms/vendor/yiisoft/yii2/base/InlineAction.php(57): call_user_func_array(Array, Array)","#2 /Applications/MAMP/htdocs/SD/sdms/vendor/yiisoft/yii2/base/Controller.php(157): yii\\base\\InlineAction->runWithParams(Array)","#3 /Applications/MAMP/htdocs/SD/sdms/vendor/yiisoft/yii2/base/Module.php(528): yii\\base\\Controller->runAction('create', Array)","#4 /Applications/MAMP/htdocs/SD/sdms/vendor/yiisoft/yii2/web/Application.php(103): yii\\base\\Module->runAction('orders/create', Array)","#5 /Applications/MAMP/htdocs/SD/sdms/vendor/yiisoft/yii2/base/Application.php(386): yii\\web\\Application->handleRequest(Object(yii\\web\\Request))","#6 /Applications/MAMP/htdocs/SD/sdms/frontend/web/index.php(17): yii\\base\\Application->run()","#7 {main}"]}
问题是您在
POSTMAN
中以GET请求
的形式发送请求,而控制器中的操作
需要一个POST请求
在左侧的POSTMAN客户端中,有一个选择器,您可以在其中选择正在执行的请求类型
您得到的第二个错误是,一旦您删除POST的必要条件,get请求将进入操作
,并转到此处:
} elseif (!\Yii::$app->request->isPost) {
$model->load(Yii::$app->request->get());
}
并尝试使用GET
参数中的数据加载模型,但失败了,因为默认的$model->load()
无法知道如何映射GET请求中的数据
在任何情况下(获取或发布)$model->load()
都不会工作,因为如果您检查load()函数,您会发现它会在数组中搜索对象模态名称以加载参数,因此您必须执行以下操作:
http://localhost:8888/SD/sdms/orders/create?Orders%5Blivre%5=L'Arbre
但是对于每个参数,您在stringify['Orders'=>['livre'=>'Larbre']]
的结果中看到的奇怪字符,问题是您在邮递员中发送请求作为获取请求
,而控制器中的操作
需要发布请求
在左侧的POSTMAN客户端中,有一个选择器,您可以在其中选择正在执行的请求类型
您得到的第二个错误是,一旦您删除POST的必要条件,get请求将进入操作
,并转到此处:
} elseif (!\Yii::$app->request->isPost) {
$model->load(Yii::$app->request->get());
}
并尝试使用GET
参数中的数据加载模型,但失败了,因为默认的$model->load()
无法知道如何映射GET请求中的数据
在任何情况下(获取或发布)$model->load()
都不会工作,因为如果您检查load()函数,您会发现它会在数组中搜索对象模态名称以加载参数,因此您必须执行以下操作:
http://localhost:8888/SD/sdms/orders/create?Orders%5Blivre%5=L'Arbre
但是对于每个参数,您在stringify结果中看到的奇怪字符['Orders'=>['livre'=>'Larbre']]
嘿,谢谢您的回答!但是我是用POST而不是GET从邮递员那里发送的,所以我不明白你怎么说第一个错误,因为我说,用GET,我收到记录,没问题,但是当我用邮递员发送邮件时,我得到了我写的两件事。当我愚蠢地从后端控制器复制/粘贴我的create函数时,我改变了它(我修改了我的帖子,以便看得更清楚)但是我还是收到了同样的错误嘿,谢谢你的回答!但是我是用POST而不是get发送邮件的,所以我不明白你怎么说第一个错误,因为我说,用get,我收到了记录,没问题,但是当我用POST发送邮件时,我得到了我写的两件事。我愚蠢地复制/粘贴了我的create f从我的后端控制器,我改变了它(我修改了我的文章,以便更清楚地看到),但我仍然得到相同的错误
http://localhost:8888/SD/sdms/orders/create?Orders%5Blivre%5=L'Arbre