簡體   English   中英

Yii2 Rest api調用多種方法

[英]Yii2 Rest api call multiple methods

我正在使用這段代碼,並嘗試在yii2中使用REST API。 我試着使用你在代碼片段中看到的兩個函數。

  1. getAllData
  2. 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'); } } 

我嘗試了兩種不同方法的URL,

HTTP://本地主機/ API /網絡/ widgetmodule /空間/ getAllData

HTTP://本地主機/ API /網絡/ widgetmodule /空間/ 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',
        ],

所以任何人都可以幫助我,如何用兩種不同的方法獲得不同的輸出。

無論如何調用第一種方法。

任何幫助將不勝感激。

提前致謝。

1-您在控制器中定義的唯一2個操作是indexview ,因為索引正在渲染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(),
    ]);
}

這就是定義兩個動作: indexview ,其中索引的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';
}

首先取消設置默認索引和視圖操作,如下所示:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM