我正在使用这段代码,并尝试在yii2中使用REST API。 我试着使用你在代码片段中看到的两个函数。
getSpecificData
<?php
namespace app\api\modules\widgetmodule\controllers;
use yii\rest\Controller;
class WidgetController extends Controller
{
public $modelClass = 'app\models\DynamicWidget';
public function actions()
{
return [
'index' => [
'class' => 'yii\rest\IndexAction',
'modelClass' => $this->modelClass,
'prepareDataProvider' => [$this, 'getAllData']
],
'view' => [
'class' => 'yii\rest\ViewAction',
'modelClass' => $this->modelClass,
'prepareDataProvider' => [$this, 'getSpecificData']
],
];
}
public function getAllData()
{
die('get all data');
}
public function getSpecificData()
{
die('get specific data');
}
}
我为两种不同的方法尝试了两个网址,
http://localhost/api/web/widgetmodule/widget/getAllData
http://localhost/api/web/widgetmodule/widget/getSpecificData
但输出总是如此。
引用 获取所有数据
这是我在api.php中的URL管理器代码
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
'<controller:\w+>/<action:\w+>/<id:\w+>' => '<controller>/<action>',
'<controller:\w+>/<action:\w+>' => '<controller>/<action>',
[
'class' => 'yii\rest\UrlRule',
'controller' => ['widgetmodule/widget']
]
],
],
'db' => $db,
],
'modules' => [
'widgetmodule' => [
'class' => 'app\api\modules\widgetmodule\Module',
],
所以任何人都可以帮助我,如何用两种不同的方法获得不同的输出。
无论如何都是调用第一种方法。
任何帮助将不胜感激。
提前致谢。
答案 0 :(得分:0)
1-您在控制器中定义的唯一2个操作是index
和view
,因为索引正在呈现getAllData
,这就是您获得该输出的原因。
2- view
操作没有prepareDataProvider
属性。
也许你的意思是这样的:
public function actions()
{
return [
'index' => [
'class' => 'yii\rest\IndexAction',
'modelClass' => $this->modelClass,
'prepareDataProvider' => [$this, 'getAllData']
],
'view' => [
'class' => 'yii\rest\ViewAction',
'modelClass' => $this->modelClass,
],
];
}
public function getAllData()
{
// return some dataProvider instance to be used by index
$modelClass = $this->modelClass;
return new ActiveDataProvider([
'query' => $modelClass::find(),
]);
}
这就是定义两个操作:index
和view
,其中index的dataProvider被自定义函数getAllData()
覆盖。这需要类似于那些配置的东西:
[
'class' => 'yii\rest\UrlRule',
'controller' => ['widgetmodule/widget'],
'patterns' => [
'GET,HEAD index' => 'index',
'GET,HEAD view/{id}' => 'view',
]
],
因此,您可以在以下端点中访问它们:
http://localhost/api/web/widgetmodule/widget/index
http://localhost/api/web/widgetmodule/widget/view/4
现在,如果您的问题是如何为此添加额外操作以响应uri http://localhost/api/web/widgetmodule/widget/getSpecificData
,那么您需要将其添加到您的模式中:
'patterns' => [
...
...
'GET getSpecificData' => 'some-specific-data',
]
并按照官方文档中的说明在控制器中定义该操作,只需添加以下内容:
public function actionSomeSpecificData()
{
return 'some specific data';
}
答案 1 :(得分:0)
首先取消设置默认索引和视图操作,如下所示:
public function actions()
{
$actions = parent::actions();
// unset default index action for custom our own code
unset($actions['index']);
unset($actions['view']);
return ArrayHelper::merge($actions, [
'index' => [
'class' => 'yii\rest\IndexAction',
'modelClass' => $this->modelClass,
'prepareDataProvider' => [$this, 'getAllData']
],
'view' => [
'class' => 'yii\rest\ViewAction',
'modelClass' => $this->modelClass,
'prepareDataProvider' => [$this, 'getSpecificData']
],
];
}
像这样配置路线:
[
'class' => 'yii\rest\UrlRule',
'controller' => ['widgetmodule/widget'],
'patterns' => [
'GET,HEAD index' => 'index',
'GET,HEAD view/{id}' => 'view',
]
],
然后你可以打电话给这些网址:
http://localhost/api/web/widgetmodule/widget/index
http://localhost/api/web/widgetmodule/widget/view/4