以下是我的RESTful控制器的样子。
<?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(){
//Need to call this function on every create
//This should also have the information about the newly created user
}
}
&#13;
它可以很好地处理默认行为,但您只是创建用户并退出是不太实际的。您需要发送带有验证链接SMS等的电子邮件,可能会根据此操作更新其他一些模型。
我不想完全覆盖create方法,因为它可以很好地保存数据并返回JSON。 我只是想通过添加一个函数的回调类来扩展它的功能,该函数可以接受新创建的用户并向该人发送电子邮件。
答案 0 :(得分:3)
正如您所看到的,这是使用prepareDataProvider来更改索引操作正常使用的正常方式。这非常方便。您可以在此处找到prepareDataProvider的定义:http://www.yiiframework.com/doc-2.0/yii-rest-indexaction.html#prepareDataProvider()-detail
现在您可以看到,在Run()和beforeRun()之后还有2个其他方法也可用于创建操作。 http://www.yiiframework.com/doc-2.0/yii-rest-createaction.html
您可以使用这两个函数并声明它们类似于prepareDataProvider来执行更多内容,例如发送电子邮件。我自己没试过,但我相信这应该是要走的路。
答案 1 :(得分:2)
最简单的方法是从模型中的afterSave()
方法中获益。每次保存过程后都会调用此方法。
public function afterSave($insert, $changedAttributes) {
//calling a send mail function
return parent::afterSave($insert, $changedAttributes);
}
此方法的另一个优点是您存储在对象模型中的数据。例如,访问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,则触发EVENT_AFTER_UPDATE
事件。使用的事件类是yii\db\AfterSaveEvent
。覆盖此方法时,请确保调用父实现以便触发事件。