2015-10-18 6 views
5

私の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 
 
    } 
 

 
    }

これはデフォルトの動作と非常によく動作しますが、あなただけのユーザーと終了を作成することは非常に実用的ではありません。あなたは確認リンクSMSなどで電子メールを送信する必要があります、このアクションに基づいていくつかの他のモデルを更新するかもしれません。

データを保存してJSONを返すのにうまくいくので、createメソッドを完全にオーバーライドしたくありません。 私は、新しく作成されたユーザーを受け入れ、その人に電子メールを送ることのできるコールバックの種類の関数を追加することによってその機能を拡張したいだけです。

答えて

2

お使いのモデルでafterSave()メソッドを使用すると最も簡単な方法が得られます。このメソッドは、各保存プロセスの後に呼び出されます。

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

この方法のもう1つの利点は、オブジェクトモデルに保存したデータです。 emailフィールドへのアクセス例:

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

$this->emailの値がデータベースに保存値を含むされます。

あなたは、モデルがデータベースに新しいレコードを保存するか、既存のレコードを更新しているかどうかを検出する$this->isNewRecordの恩恵を受けることができます。見てください:

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

新しいレコードがデータベースに保存されている場合のみ、メールを送信します。

Yii2のEVENTSのメリットもありますのでご注意ください。

As official Yii2's documentation

このメソッドは、レコードの挿入や更新の終了時に呼び出されます。 デフォルト実装では、$ insertがtrueの場合はEVENT_AFTER_INSERTイベントがトリガーされ、$ insertがfalseの場合はイベントがトリガーされます。使用されるイベントクラスはyii\db\AfterSaveEventです。このメソッドをオーバーライドするときは、イベントがトリガーされるように親実装を呼び出す必要があります。

+0

私のコードでこの関数を追加しましたが、呼び出されていません。それを上書きするために何かを書く必要がありますか? – Viky293

+0

@ Viky293これは 'Model'クラスのメソッドです。つまり、 'backend \ models \ User'です。 'backend \ models \ User'クラスでそれを上書きする必要があります。 –

+0

助けてくれてありがとうが、私はモデルの中に電子メールを送るためのコードを入れたくない。私はあなたが説明したのと同様の方法でafterAction()関数を試してみましたが、すべてのコントローラアクションの後にafterActionが呼び出されるため、良い解決策が見つかりません。 – Viky293

3

こちらをご覧ください:https://github.com/githubjeka/yii2-rest/blob/bf034d26f90faa3023e5831d1eb165854c5c7aaf/rest/versions/v1/controllers/PostController.php

を使用すると、これはindexアクションが使用している通常の方法を変更するprepareDataProviderを使用して見ることができるように。これはとても便利です。ここではprepareDataProviderの定義を見つけることができます:http://www.yiiframework.com/doc-2.0/yii-rest-indexaction.html#prepareDataProvider()-detail

ここから分かるように、createアクションでも使用できる2つのメソッドafterRun()とbeforeRun()があります。 http://www.yiiframework.com/doc-2.0/yii-rest-createaction.html

これらの2つの関数を使用して、prepareDataProviderと同様に宣言して、電子メールの送信などの作業を行うことができます。私は自分でそれを試していないが、私はそれが行く方法でなければならないと信じています。

関連する問題