如何在Yii2 restful控制器中执行附加任务


How to perform additional tasks in Yii2 restful controller?

这是我的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
    }
  }

它在默认行为下工作得很好,但如果您只创建用户并退出则不太实际。您需要发送带有验证链接的电子邮件短信等,可能会根据此操作更新其他一些模型。

我不想完全覆盖create方法,因为它很好地保存数据并返回JSON。我只是想通过添加一个回调函数来扩展它的功能,它可以接受新创建的用户并向该人发送电子邮件。

看这里:https://github.com/githubjeka/yii2-rest/blob/bf034d26f90faa3023e5831d1eb165854c5c7aaf/rest/versions/v1/controllers/PostController.php

正如您所看到的,这是使用prepareDataProvider来改变索引操作的正常使用方式。这很方便。您可以在这里找到prepareDataProvider的定义:http://www.yiiframework.com/doc-2.0/yii-rest-indexaction.html#prepareDataProvider()-detail

现在你可以看到有两个额外的方法afterRun()和beforeRun()也可用于创建操作。http://www.yiiframework.com/doc - 2.0 -/- yii rest - createaction.html

你可以使用这两个函数,并像prepareDataProvider一样声明它们来做更多的事情,比如发送电子邮件。我自己还没有试过,但我相信这应该是一条可行的道路。

最简单的方法是从模型中的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中受益。

作为官方Yii2的文档:

此方法在插入或更新记录结束时调用。当$insert为真时,默认实现将触发EVENT_AFTER_INSERT事件,如果$insert为假,则触发EVENT_AFTER_UPDATE事件。使用的事件类是yii'db'AfterSaveEvent。当重写此方法时,请确保调用父实现,以便触发事件。