首页 > 解决方案 > 如何在 Yii2 高级模板中发布动作 REST API

问题描述

我有一个问题要问你们:) 我正在尝试在我的 yii2 高级模板上添加一个 API,因为我希望我的 wordpress 网站将数据发送到我的 yii2 应用程序。我的系统:1)Yii2 高级模板 2)wordpress 网站 3)我的 wordpress 插件与 vuejs 和 axios 通过 API 在我的 yii2 应用程序中创建一个新条目所以我已经做了什么:common/config/main.php(因为我使用 AccessController ,我添加了 orders/* 以允许它)

'as access' => [
'class' => 'mdm\admin\components\AccessControl',
'allowActions' => [
    'orders/*',
],

前端/config/main.php

'components' => [
'request' => [
    'parsers' => [
        'application/json' => 'yii\web\JsonParser',
    ],

和(在 urlManager 数组中)

['class'=>'yii\rest\UrlRule','controller'=>'Orders'],
[‘class'=>'yii\rest\UrlRule','controller'=>'Contacts']

然后我的控制器:

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


}


}

所以,我使用 Postman 和:http://localhost:8888/SD/sdms/orders/我得到一个记录,没问题

但是当我做一个 POST 时:

http://localhost:8888/SD/sdms/orders/create?livre=L'Arbre Musicien&langue=Allemand&nom=Perroud&prenom=LIttledave&nombre=2&npa=1221&pays=suisse&accept_pc=1&mail=post@post.ch&etat=1&message=lbablalbal&tel=01201201212

答案是

{"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}"]}

标签: phpapivue.jsyii2yii2-advanced-app

解决方案


问题是您将您的请求POSTMAN作为 a发送GET REQUEST,而您的ACTIONinCONTROLLER期望 a POST REQUEST

在左侧的 POSTMAN 客户端中,有一个选择器,您可以在其中选择您正在执行的请求类型。

你得到的第二个错误是因为一旦你删除了 POST 的必要条件,GET 请求action就会进入这里:

} elseif (!\Yii::$app->request->isPost) {
   $model->load(Yii::$app->request->get());
}

并尝试使用GET参数中的数据加载模型,但失败了,因为默认设置$model->load()不知道如何在您的 GET 请求中映射数据。

在任何情况下(GET 或 POST)$model->load()都将不起作用,就像您检查 load() 函数一样,您会发现它在数组中搜索对象模式名称以加载参数,因此您必须这样做:

http://localhost:8888/SD/sdms/orders/create?Orders%5Blivre%5=L'Arbre

但是对于每个参数,您在 stringify 的结果中看到的奇怪字符['Orders' => ['livre' => 'Larbre']]


推荐阅读