2016-09-08 2 views
1

Ich verwende dieses Stück Code, und versuchen Sie mit REST-API in yii2. Ich habe versucht, zwei Funktionen zu verwenden, wie Sie im Codeausschnitt gesehen haben.Yii2 Rest api Anruf mehrere Methoden

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

habe ich versucht, zwei URLs für die beiden verschiedenen Methoden,

http://localhost/api/web/widgetmodule/widget/getAllData

http://localhost/api/web/widgetmodule/widget/getSpecificData

Aber die Ausgabe wird immer wie sein.

Quote erhalten alle Daten

Hier mein URL Manager-Code ist in api.php

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

So jemand mir helfen könnte, wie verschiedene Ausgänge mit zwei verschiedenen Methoden zu erhalten.

Es ist sowieso die erste Methode aufrufen.

Jede Hilfe wird geschätzt.

Vielen Dank im Voraus.

+0

vergessen Sie das Wort der Handlung in cre Methode in Ihrem Controller. – mohsen

+0

Stattdessen diese 'public Funktion getAllData()' verwenden Sie diese 'public Funktion actionGetAllData()' und die URL wird 'http: // localhost/api/web/widgetmodul/widget/get-all-data' weil Sie camel case – mohsen

Antwort

0

1- Die einzigen 2 Aktionen, die Sie in Ihrem Controller definiert haben, sind index und view, und weil der Index getAllData rendernd ist, erhalten Sie diesen Ausgang.

2- Die view Aktion hat kein prepareDataProvider Attribut.

vielleicht gemeint Sie so etwas wie dieses stattdessen:

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(), 
    ]); 
} 

Und das ist, die zwei Aktionen: index und view wo Dataprovider-Index durch eine benutzerdefinierte Funktion getAllData() außer Kraft gesetzt wird.das erfordert etwas ähnlich den configs:

[ 
    'class' => 'yii\rest\UrlRule', 
    'controller' => ['widgetmodule/widget'], 
    'patterns' => [ 
     'GET,HEAD index' => 'index', 
     'GET,HEAD view/{id}' => 'view', 
    ] 
], 

So können Sie sie innerhalb der folgenden Endpunkte zugreifen:

http://localhost/api/web/widgetmodule/widget/index 
http://localhost/api/web/widgetmodule/widget/view/4 

Nun, wenn Ihre Frage ist, wie eine zusätzliche Aktion zu, dass zu geben, um zu antworten die uri http://localhost/api/web/widgetmodule/widget/getSpecificData dann müssen Sie diese zu Ihrem Muster hinzuzufügen:

'patterns' => [ 
    ... 
    ... 
    'GET getSpecificData' => 'some-specific-data', 
] 

und definieren die Aktion in Ihrem Controller wie einfach in offizieller Dokumentation beschrieben diese Zugabe:

public function actionSomeSpecificData() 
{ 
    return 'some specific data'; 
} 
+0

verwenden Danke Salem, ich habe alle Muster geändert, für benutzerdefinierte Funktion und für die Ansicht Aktion überschreiben. Aber ich bekomme immer noch die gleiche Ausgabe für alle Anfragen. ** "alle Daten erhalten" **. Sind noch weitere Änderungen erforderlich? – user3483449

0

Erste ungesetzt Standardindex und Ansichtsaktionen, wie folgt aus:

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

Config Routen wie folgt aus:

[ 
    'class' => 'yii\rest\UrlRule', 
    'controller' => ['widgetmodule/widget'], 
    'patterns' => [ 
    'GET,HEAD index' => 'index', 
    'GET,HEAD view/{id}' => 'view', 
] 
], 

Dann können Sie diese URLs aufrufen:

http://localhost/api/web/widgetmodule/widget/index 
http://localhost/api/web/widgetmodule/widget/view/4