Yii2 Rest api调用多种方法

时间:2016-09-08 04:33:32

标签: php rest yii2

我正在使用这段代码,并尝试在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');
    }
    }
    
  3. 我为两种不同的方法尝试了两个网址,

    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',
            ],
    

    所以任何人都可以帮助我,如何用两种不同的方法获得不同的输出。

    无论如何都是调用第一种方法。

    任何帮助将不胜感激。

    提前致谢。

2 个答案:

答案 0 :(得分:0)

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,其中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