2015-10-18 4 views
5

Вот как выглядит мой контроллер RESTful.Как выполнить дополнительные задачи в контроллере yii2 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(){ 
 
\t //Need to call this function on every create 
 
\t //This should also have the information about the newly created user 
 
    } 
 

 
    }

Он работает очень хорошо с поведением по умолчанию, но это не очень практично, что вы просто создать пользователя и выход. Вам необходимо отправить электронное письмо с подтверждением ссылки SMS и т. Д., Возможно, будут обновлены некоторые другие модели, основанные на этом действии.

Я не хочу полностью переопределять метод создания, так как он хорошо работает для сохранения данных и возврата назад JSON. Я просто хочу расширить функциональность, добавив функцию обратного вызова функции, которая может принять вновь созданного пользователя и отправить электронное письмо человеку.

ответ

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's EVENTS.

As official Yii2's documentation:

Этот метод вызывается по окончании добавления или обновления записи. Реализация по умолчанию инициирует событие EVENT_AFTER_INSERT, когда $ insert является true или событие EVENT_AFTER_UPDATE, если $ insert является ложным. Используемый класс событий - 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

Как вы можете видеть это с помощью prepareDataProvider изменить обычный способ действия индекс использует. Это очень удобно. Вы можете найти определение prepareDataProvider здесь: http://www.yiiframework.com/doc-2.0/yii-rest-indexaction.html#prepareDataProvider()-detail

Теперь, как вы можете видеть, есть два дополнительных метода afterRun() и beforeRun(), которые также доступны для действия create. http://www.yiiframework.com/doc-2.0/yii-rest-createaction.html

Возможно, вы сможете использовать эти 2 функции и объявить их похожими на prepareDataProvider, чтобы делать больше таких вещей, как отправка электронной почты.Я сам их не пробовал, но я считаю, что это должен быть путь.

Смежные вопросы