2015-10-18 13 views
5

यहां मेरा रीस्टफुल कंट्रोलर कैसा दिखता है।वाईआई 2 आरामदायक नियंत्रक में अतिरिक्त कार्य कैसे करें?

<?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 
 
    } 
 

 
    }

यह डिफ़ॉल्ट व्यवहार के साथ बहुत अच्छी तरह से काम करता है, लेकिन यह बहुत ही व्यावहारिक है कि आप बस उपयोगकर्ता और बाहर निकलने का निर्माण करेगा नहीं है। आपको सत्यापन लिंक एसएमएस आदि के साथ ईमेल भेजने की आवश्यकता है, इस क्रिया के आधार पर कुछ अन्य मॉडल अपडेट हो सकते हैं।

मैं पूरी तरह से निर्माण विधि को ओवरराइड नहीं करना चाहता क्योंकि यह डेटा को बचाने और JSON वापस लौटने के लिए अच्छी तरह से काम करता है। मैं सिर्फ एक कॉलबैक प्रकार को जोड़कर अपनी कार्यक्षमता का विस्तार करना चाहता हूं जो नव निर्मित उपयोगकर्ता को स्वीकार कर सकता है और व्यक्ति को ईमेल भेज सकता है।

उत्तर

2

सबसे आसान तरीका आपके मॉडल में afterSave() विधि से लाभ प्राप्त होगा। प्रत्येक विधि को सहेजने के बाद इस विधि को बुलाया जाएगा।

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

इस विधि का एक अन्य लाभ वह डेटा है जिसे आपने अपने ऑब्जेक्ट मॉडल में संग्रहीत किया है।

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

$this->email का मूल्य डेटाबेस में बचत मूल्य युक्त है: उदाहरण के लिए 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:

इस विधि डालने या एक रिकॉर्ड को अपडेट करने के अंत में कहा जाता है। डिफ़ॉल्ट कार्यान्वयन EVENT_AFTER_INSERT ईवेंट ट्रिगर करेगा जब $ सम्मिलित सत्य है, या EVENT_AFTER_UPDATE ईवेंट अगर $ सम्मिलित है तो गलत है। इस्तेमाल की जाने वाली इवेंट क्लास yii\db\AfterSaveEvent है। इस विधि को ओवरराइड करते समय, सुनिश्चित करें कि आप पैरेंट कार्यान्वयन को कॉल करते हैं ताकि ईवेंट ट्रिगर हो।

+0

मैंने इस फ़ंक्शन को मेरे कोड में जोड़ा है लेकिन इसे कॉल नहीं किया जा रहा है, क्या मुझे इसे ओवरराइड करने के लिए कुछ लिखना होगा? – Viky293

+0

@ Viky293 यह आपके 'मॉडल' वर्ग में एक विधि है। मेरा मतलब है: 'बैकएंड \ मॉडल \ उपयोगकर्ता'। आपको इसे 'बैकएंड \ मॉडल \ उपयोगकर्ता' कक्षा में ओवरराइड करना होगा। –

+0

मदद के लिए धन्यवाद, लेकिन मैं मॉडल के अंदर ईमेल भेजने के लिए कोड नहीं रखना चाहता हूं। मैंने बाद में एक्शन() फ़ंक्शन के साथ प्रयास किया है, जैसा कि आपने समझाया है, लेकिन मुझे भी एक अच्छा समाधान नहीं मिला है क्योंकि सभी नियंत्रक कार्यों के बाद कार्रवाई को कॉल किया जाएगा। – Viky293

3

यहाँ एक नज़र डालें: https://github.com/githubjeka/yii2-rest/blob/bf034d26f90faa3023e5831d1eb165854c5c7aaf/rest/versions/v1/controllers/PostController.php

आप देख सकते हैं इस prepareDataProvider उपयोग कर रहा है सामान्य तरीके सूचकांक कार्रवाई उपयोग कर रहा है बदलने के लिए। यह बहुत आसान है। आप यहां तैयार करने की परिभाषाडेटाप्रोवाइडर की परिभाषा पा सकते हैं: http://www.yiiframework.com/doc-2.0/yii-rest-indexaction.html#prepareDataProvider()-detail

अब आप देख सकते हैं कि रून() और पहलेRun() के बाद 2 अतिरिक्त विधियां हैं जो निर्माण कार्य के लिए भी उपलब्ध हैं। http://www.yiiframework.com/doc-2.0/yii-rest-createaction.html

आप इन 2 कार्यों का उपयोग करने में सक्षम हो सकते हैं और उन्हें ईमेल भेजने जैसे अधिक चीजों को करने के लिए तैयारडेटाप्रोवाइडर के समान घोषित कर सकते हैं।मैंने खुद को कोशिश नहीं की है, लेकिन मुझे विश्वास है कि जाने का रास्ता होना चाहिए।

संबंधित मुद्दे