2016-05-11 13 views
1

Hallo allerseits i erholsamen api in yii2 bin der Umsetzung und einen Konflikt in ActionDelete mit und ActionDeleteallLöschen und DeleteAll Aktion Überschreibung in yii2 ActiveController

, wenn ich einen Parameter in URL wie http://localhost/yii2-api/api/modules/v1/countries/CD passieren, es funktioniert und löscht den Eintrag CD aus Datenbank mit DELETE Anfrage. Ich weiß nicht, wie ich mehrere codes in URL übergeben kann, so dass es auf actionDeleteall umleitet. Hier ist mein controller Code.

class CountryController extends ActiveController 
{ 
public $modelClass = 'api\modules\v1\models\Country'; 

public function actions() 
{ 
    $actions = parent::actions(); 
    unset($actions['index']); 
    unset($actions['create']); 
    unset($actions['delete']); 
    unset($actions['update']); 
    unset($actions['view']); 
    return $actions; 
} 

public function actionDelete($id) 
{ 
    $model=$this->findModel($id); 

    if($model->delete()) 
    { 
     $this->setHeader(200); 
     echo json_encode(array('status'=>1,'data'=>array_filter($model->attributes)),JSON_PRETTY_PRINT); 

    } 
    else 
    { 

     $this->setHeader(400); 
     echo json_encode(array('status'=>0,'error_code'=>400,'errors'=>$model->errors),JSON_PRETTY_PRINT); 
    } 

} 

public function actionDeleteall() 
{ 
    $ids=json_decode($_REQUEST['codes']); 

    $data=array(); 

    foreach($ids as $id) 
    { 
     $model=$this->findModel($id); 

     if($model->delete()) 
      $data[]=array_filter($model->attributes); 
     else 
     { 
      $this->setHeader(400); 
      echo json_encode(array('status'=>0,'error_code'=>400,'errors'=>$model->errors),JSON_PRETTY_PRINT); 
      return; 
     } 
    } 

    $this->setHeader(200); 
    echo json_encode(array('status'=>1,'data'=>$data),JSON_PRETTY_PRINT); 

} 

} 

Hier ist mein urlmanager Code

'urlManager' => [ 
     'enablePrettyUrl' => true, 
     'enableStrictParsing' => false, 
     'showScriptName' => false, 
     'rules' => [ 
      [ 
       'class' => 'yii\rest\UrlRule', 
       'controller' => 'v1/country', // our country api rule, 
       'tokens' => [ 
        '{id}' => '<id:\\w+>' 
       ], 
      ] 
     ], 
    ] 

wissen Lassen Sie mich, wie ich diese Aktion überschreiben können und den Zugang mit mehreren codes geben. Danke

Antwort

1

Sie könnten eine Reihe von ID-Werte-Array schreiben und eine Schleife ausführen

Dies ist nur eine kleine Anregung
obviuosly sollten Sie

public function actionDelete($myArray) 
    { 
     foreach($myArray as $key => $value){ 

     $model=$this->findModel($value) 
     $model->delete(); 
     } 
} 

Benutzer resultierendes Echo Management einen entsprechenden Fehler eval Wenn Sie haben Sie Array von id in

$myArray[0] = 'CD'; 
$myArray[1] = 'AA'; 

die uRL

sein sollte

http://localhost/yii2-api/api/horsebuzz/api/web/v1/countries/myArray=[27,28]

Oder wenn Sie Code verwenden actionDelete verwenden ($ code) ... Anzeige so auf

Oder besser, wenn die Verwendung UrlHelper

Url::to(['/countries/delete' , 'myArray' => [27,28] ]); 

    Url::to(['/countries/delete' , 'myArray' => $myArray ]); 
+0

Ich aktualisiere haben die Antwort – scaisEdge

+0

versucht, das so gut, aber es geht zu 'actionDelete ($ id)' nur, wenn ich pass 1 Wert in URL wie http: // localhost/yii2-api/api/web/v1/countries/27 und wenn ich http: // localhost/yii2-api/api/web/v1/countries/codes = [27,28] mit der Methode 'DELETE' übergebe, gibt es einen Fehler von 404. –

+0

I habe update die Antwort .. – scaisEdge

1

erste strenge Parsing in urlManager deaktivieren

'enableStrictParsing' => false 

dann können Sie Ihre benutzerdefinierten Aktionen mit jeder Methode die URL aufrufen l aussehen wie

http://localhost/yii2-api/api/web/v1/country/uraction 
+0

Ja, ich habe versucht, auch. Es funktioniert immer noch wie zuvor und wenn ich Land/deleteall es nicht funktioniert überhaupt und löst 404 Fehler. –

+0

siehe bearbeiten wird es web/v1 und nicht modules/v1 –

+0

ja ich bereits mit 'web/v1' versucht aber nicht funktioniert –