2015-10-18 15 views
5

Đây là cách trình điều khiển RESTful của tôi trông như thế nào.Làm cách nào để thực hiện các tác vụ bổ sung trong bộ điều khiển yên tĩnh 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 
 
    } 
 

 
    }

Nó hoạt động rất tốt với hành vi mặc định nhưng nó không phải là rất thực tế rằng bạn sẽ chỉ tạo người dùng và thoát. Bạn cần phải gửi email với liên kết xác minh SMS vv, có thể được cập nhật một số mô hình khác dựa trên hành động này.

Tôi không muốn ghi đè hoàn toàn phương thức tạo vì nó hoạt động tốt để lưu dữ liệu và trả về JSON. Tôi chỉ muốn mở rộng chức năng của nó bằng cách thêm một loại gọi lại của một hàm có thể chấp nhận người dùng mới được tạo và gửi email cho người đó.

Trả lời

2

Cách dễ nhất sẽ được hưởng lợi từ phương pháp afterSave() trong mô hình của bạn. Phương thức này sẽ được gọi sau mỗi quá trình lưu.

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

Một ưu điểm khác của phương pháp này là dữ liệu bạn đã lưu trữ trong mô hình đối tượng của mình. Ví dụ truy cập email lĩnh vực:

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

giá trị của $this->email được chứa giá trị tiết kiệm vào cơ sở dữ liệu.

Note Bạn có thể hưởng lợi từ $this->isNewRecord để phát hiện xem các mô hình được tiết kiệm kỷ lục mới vào cơ sở dữ liệu hoặc cập nhật một bản ghi hiện có. Hãy xem:

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

Bây giờ, nó chỉ gửi thư nếu hồ sơ mới được lưu vào cơ sở dữ liệu.

Xin lưu ý rằng bạn cũng có thể hưởng lợi từ số EVENTS của Yii2.

As official Yii2's documentation:

Phương pháp này được gọi là vào cuối chèn hoặc cập nhật một kỷ lục. Việc triển khai mặc định sẽ kích hoạt sự kiện EVENT_AFTER_INSERT khi $ chèn là đúng hoặc sự kiện EVENT_AFTER_UPDATE nếu $ chèn là sai. Lớp sự kiện được sử dụng là yii\db\AfterSaveEvent. Khi ghi đè phương thức này, hãy đảm bảo bạn gọi triển khai gốc để sự kiện được kích hoạt.

+0

Tôi đã thêm chức năng này vào mã của mình nhưng nó không được gọi, tôi có phải viết gì đó để ghi đè lên nó không? – Viky293

+0

@ Viky293 Đây là phương thức trong lớp 'Mô hình' của bạn. Ý tôi là: 'backend \ models \ User'. Bạn phải ghi đè lên nó trong lớp 'backend \ models \ User'. –

+0

Cảm ơn bạn đã trợ giúp, nhưng tôi không muốn đặt mã để gửi email bên trong các mô hình. Tôi đã thử với hàm afterAction(), theo cách tương tự như bạn đã giải thích, nhưng điều đó cũng không tìm thấy một giải pháp tốt vì hành động afterAction sẽ được gọi sau tất cả các hành động của bộ điều khiển. – Viky293

3

Hãy xem ở đây: https://github.com/githubjeka/yii2-rest/blob/bf034d26f90faa3023e5831d1eb165854c5c7aaf/rest/versions/v1/controllers/PostController.php

Như bạn có thể thấy điều này là sử dụng prepareDataProvider để thay đổi cách bình thường action index đang sử dụng. Điều này rất tiện dụng. Bạn có thể tìm định nghĩa của PrepareDataProvider tại đây: http://www.yiiframework.com/doc-2.0/yii-rest-indexaction.html#prepareDataProvider()-detail

Bây giờ bạn có thể thấy có 2 phương thức bổ sung afterRun() và beforeRun() cũng có sẵn cho hành động tạo. http://www.yiiframework.com/doc-2.0/yii-rest-createaction.html

Bạn có thể sử dụng 2 chức năng này và khai báo chúng tương tự như PrepareDataProvider để thực hiện nhiều việc hơn như gửi email.Tôi đã không thử chúng bản thân mình nhưng tôi tin rằng đó phải là con đường để đi.

Các vấn đề liên quan