2015-10-18 12 views
5

Ecco come appare il mio controller RESTful.Come eseguire attività aggiuntive nel controller restful Yii2?

<?php 
 

 
namespace backend\controllers; 
 
use yii\rest\Controller; 
 
use yii; 
 
use yii\web\Response; 
 
use yii\helpers\ArrayHelper; 
 

 

 
class UserController extends \yii\rest\ActiveController 
 
{ 
 
    public function behaviors() 
 
    { 
 
    return ArrayHelper::merge(parent::behaviors(), [ 
 
     [ 
 
     'class' => 'yii\filters\ContentNegotiator', 
 
     'only' => ['view', 'index'], // in a controller 
 
     // if in a module, use the following IDs for user actions 
 
     // 'only' => ['user/view', 'user/index'] 
 
     'formats' => [ 
 
      'application/json' => Response::FORMAT_JSON, 
 
     ], 
 
     'languages' => [ 
 
      'en', 
 
      'de', 
 
     ], 
 
     ], 
 
     [ 
 
     'class' => \yii\filters\Cors::className(), 
 
     'cors' => [ 
 
      'Origin' => ['*'], 
 
      'Access-Control-Request-Method' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'], 
 
      'Access-Control-Request-Headers' => ['*'], 
 
      'Access-Control-Allow-Credentials' => true, 
 
      'Access-Control-Max-Age' => 86400, 
 
     ], 
 
     ], 
 

 

 
     ]); 
 
    } 
 

 

 

 
    public $modelClass = 'backend\models\User'; 
 

 
    public function actions() 
 
    { 
 

 
    } 
 

 

 
    public function sendMail(){ 
 
\t //Need to call this function on every create 
 
\t //This should also have the information about the newly created user 
 
    } 
 

 
    }

Funziona molto bene con il comportamento di default, ma non è molto pratico che vi sarà solo creare l'utente e di uscita. È necessario inviare e-mail con il link di verifica SMS, ecc, potrebbe essere l'aggiornamento di alcuni altri modelli basati su questa azione.

Non voglio ignorare completamente il metodo di creare funziona bene per salvare i dati e tornare indietro JSON. Voglio solo estendere la sua funzionalità aggiungendo un tipo di callback di una funzione che può accettare l'utente appena creato e inviare una e-mail alla persona.

risposta

2

Il modo più semplice sarebbe sempre beneficio dalla afterSave() metodo nel modello. Questo metodo verrà chiamato dopo ogni processo di salvataggio.

public function afterSave($insert, $changedAttributes) { 
    //calling a send mail function 
    return parent::afterSave($insert, $changedAttributes); 
} 

Un altro vantaggio di questo metodo sono i dati memorizzati nel modello di oggetto. Per esempio l'accesso ai email campo:

public function afterSave($insert, $changedAttributes) { 
    //calling a send mail function 
    \app\helpers\EmailHelper::send($this->email); 
    return parent::afterSave($insert, $changedAttributes); 
} 

il valore di $this->email è che contiene il valore salvifico nel database.

Nota È possibile beneficiare $this->isNewRecord per rilevare se il modello è il risparmio nuovo record nel database o l'aggiornamento di un record esistente. Date un'occhiata:

public function afterSave($insert, $changedAttributes) { 
    if($this->isNewRecord){ 
     //calling a send mail function 
     \app\helpers\EmailHelper::send(**$this->email**); 
    } 
    return parent::afterSave($insert, $changedAttributes); 
} 

Ora invia solo la posta se il nuovo record viene salvato nel database.

Si prega di notare che si può anche beneficiare di Yii2 di EVENTS.

As official Yii2's documentation:

Questo metodo è chiamato alla fine di inserire o aggiornamento di un record. L'implementazione predefinita attiverà un evento EVENT_AFTER_INSERT quando $ insert è vero o un evento EVENT_AFTER_UPDATE se $ insert è falso. La classe evento utilizzata è yii\db\AfterSaveEvent. Quando si sostituisce questo metodo, assicurarsi di chiamare l'implementazione genitore in modo che l'evento venga attivato.

+0

Ho aggiunto questa funzione nel mio codice ma non viene chiamata, dovrò scrivere qualcosa per sovrascriverlo? – Viky293

+0

@ Viky293 Questo è un metodo nella classe 'Model'. Voglio dire: 'backend \ models \ User'. È necessario sovrascriverlo nella classe 'backend \ models \ User'. –

+0

Grazie per l'aiuto, ma non voglio inserire il codice per l'invio di e-mail nei modelli. Ho provato con la funzione afterAction(), in un modo simile a quello che hai spiegato, ma anche io non trovo una buona soluzione come dopo l'azione sarebbe chiamata dopo tutte le azioni del controller. – Viky293

3

dare uno sguardo qui: https://github.com/githubjeka/yii2-rest/blob/bf034d26f90faa3023e5831d1eb165854c5c7aaf/rest/versions/v1/controllers/PostController.php

Come si può vedere questo sta usando il prepareDataProvider di cambiare il modo normale l'azione index sta usando. Questo è molto utile. Puoi trovare la definizione di prepareDataProvider qui: http://www.yiiframework.com/doc-2.0/yii-rest-indexaction.html#prepareDataProvider()-detail

Ora come puoi vedere ci sono 2 metodi addizionali afterRun() e beforeRun() che sono disponibili anche per l'azione create. http://www.yiiframework.com/doc-2.0/yii-rest-createaction.html

Potrebbe essere possibile utilizzare queste 2 funzioni e dichiararle simili a prepareDataProvider per fare più cose come inviare una e-mail.Non li ho mai provati ma credo che dovrebbe essere la strada da percorrere.

Problemi correlati