Yii - मॉडल
मॉडल व्यावसायिक तर्क और नियमों का प्रतिनिधित्व करने वाली वस्तुएं हैं। एक मॉडल बनाने के लिए, आपको विस्तार करना चाहिएyii\base\Model वर्ग या उसके उपवर्ग।
गुण
विशेषताएँ व्यावसायिक डेटा का प्रतिनिधित्व करती हैं। इन्हें ऐरे एलिमेंट्स या ऑब्जेक्ट प्रॉपर्टीज की तरह एक्सेस किया जा सकता है। प्रत्येक विशेषता एक मॉडल की सार्वजनिक रूप से सुलभ संपत्ति है। यह निर्दिष्ट करने के लिए कि किसी मॉडल के पास क्या विशेषताएँ हैं, आपको ओवरराइड करना चाहिएyii\base\Model::attributes() तरीका।
हम पर एक नजर है ContactForm मूल एप्लिकेशन टेम्पलेट का मॉडल।
<?php
namespace app\models;
use Yii;
use yii\base\Model;
/**
* ContactForm is the model behind the contact form.
*/
class ContactForm extends Model {
public $name; public $email;
public $subject; public $body;
public $verifyCode; /** * @return array the validation rules. */ public function rules() { return [ // name, email, subject and body are required [['name', 'email', 'subject', 'body'], 'required'], // email has to be a valid email address ['email', 'email'], // verifyCode needs to be entered correctly ['verifyCode', 'captcha'], ]; } /** * @return array customized attribute labels */ public function attributeLabels() { return [ 'verifyCode' => 'Verification Code', ]; } /** * Sends an email to the specified email address using the information collected by this model. * @param string $email the target email address
* @return boolean whether the model passes validation
*/
public function contact($email) { if ($this->validate()) {
Yii::$app->mailer->compose() ->setTo($email)
->setFrom([$this->email => $this->name])
->setSubject($this->subject) ->setTextBody($this->body)
->send();
return true;
}
return false;
}
}
?>
Step 1 - नामक एक फंक्शन बनाएं actionShowContactModel में SiteController निम्नलिखित कोड के साथ।
public function actionShowContactModel() {
$mContactForm = new \app\models\ContactForm(); $mContactForm->name = "contactForm";
$mContactForm->email = "[email protected]"; $mContactForm->subject = "subject";
$mContactForm->body = "body"; var_dump($mContactForm);
}
उपरोक्त कोड में, हम परिभाषित करते हैं ContactForm मॉडल, सेट विशेषताएँ, और स्क्रीन पर मॉडल प्रदर्शित करें।
Step 2 - अब, यदि आप टाइप करते हैं http://localhost:8080/index.php?r=site/show-contact-model वेब ब्राउज़र के एड्रेस बार में, आपको निम्नलिखित दिखाई देगा।
यदि आपका मॉडल इससे विस्तृत है yii\base\Model, तो इसके सभी सदस्य चर (सार्वजनिक और गैर-स्थिर) विशेषता हैं। इसमें पाँच विशेषताएँ हैंContactForm मॉडल - नाम, ईमेल, विषय, शरीर, verifyCode और आप आसानी से नए जोड़ सकते हैं।
लेबल संलग्न करें
आपको अक्सर विशेषताओं से जुड़े लेबल प्रदर्शित करने की आवश्यकता होती है। डिफ़ॉल्ट रूप से, विशेषता लेबल स्वचालित रूप से उत्पन्न होते हैंyii\base\Model::generateAttributeLabel()तरीका। विशेषता लेबल को मैन्युअल रूप से घोषित करने के लिए, आप ओवरराइड कर सकते हैंyii\base\Model::attributeLabels() तरीका।
Step 1 - यदि आप खोलते हैं http://localhost:8080/index.php?r=site/contact, आप निम्न पृष्ठ देखेंगे।
ध्यान दें कि विशेषता लेबल उनके नाम के समान हैं।
Step 2 - अब, संशोधित करें attributeLabels में कार्य करते हैं ContactForm निम्नलिखित तरीके से मॉडल।
public function attributeLabels() {
return [
'name' => 'name overridden',
'email' => 'email overridden',
'subject' => 'subject overridden',
'body' => 'body overridden',
'verifyCode' => 'verifyCode overridden',
];
}
Step 3 - यदि आप खोलते हैं http://localhost:8080/index.php?r=site/contact फिर, आप देखेंगे कि निम्न छवि में दिखाए अनुसार लेबल बदल गए हैं।
परिदृश्यों
आप विभिन्न परिदृश्यों में एक मॉडल का उपयोग कर सकते हैं। उदाहरण के लिए, जब कोई अतिथि संपर्क फ़ॉर्म भेजना चाहता है, तो हमें सभी मॉडल विशेषताओं की आवश्यकता होती है। जब कोई उपयोगकर्ता एक ही कार्य करना चाहता है, तो वह पहले से ही लॉग इन है, इसलिए हमें उसके नाम की आवश्यकता नहीं है, क्योंकि हम इसे आसानी से डीबी से ले सकते हैं।
परिदृश्यों की घोषणा करने के लिए, हमें ओवरराइड करना चाहिए scenarios()समारोह। यह एक सरणी देता है जिसकी कुंजी परिदृश्य नाम और मान हैंactive attributes। सक्रिय गुण मान्य करने वाले हैं। वे भी हो सकते हैंmassively assigned।
Step 1 - संशोधित करें ContactForm निम्नलिखित तरीके से मॉडल।
<?php
namespace app\models;
use Yii;
use yii\base\Model;
/**
* ContactForm is the model behind the contact form.
*/
class ContactForm extends Model {
public $name; public $email;
public $subject; public $body;
public $verifyCode; const SCENARIO_EMAIL_FROM_GUEST = 'EMAIL_FROM_GUEST'; const SCENARIO_EMAIL_FROM_USER = 'EMAIL_FROM_USER'; public function scenarios() { return [ self::SCENARIO_EMAIL_FROM_GUEST => ['name', 'email', 'subject', 'body', 'verifyCode'], self::SCENARIO_EMAIL_FROM_USER => ['email' ,'subject', 'body', 'verifyCode'], ]; } /** * @return array the validation rules. */ public function rules() { return [ // name, email, subject and body are required [['name', 'email', 'subject', 'body'], 'required'], // email has to be a valid email address ['email', 'email'], // verifyCode needs to be entered correctly ['verifyCode', 'captcha'], ]; } /** * @return array customized attribute labels */ public function attributeLabels() { return [ 'name' => 'name overridden', 'email' => 'email overridden', 'subject' => 'subject overridden', 'body' => 'body overridden', 'verifyCode' => 'verifyCode overridden', ]; } /** * Sends an email to the specified email address using the information collected by this model. * @param string $email the target email address
* @return boolean whether the model passes validation
*/
public function contact($email) { if ($this -> validate()) {
Yii::$app->mailer->compose() ->setTo($email)
->setFrom([$this->email => $this->name])
->setSubject($this->subject) ->setTextBody($this->body)
->send();
return true;
}
return false;
}
}
?>
हमने दो परिदृश्य जोड़े हैं। एक अतिथि के लिए और दूसरा प्रमाणीकृत उपयोगकर्ता के लिए। जब उपयोगकर्ता प्रमाणित होता है, तो हमें उसके नाम की आवश्यकता नहीं होती है।
Step 2 - अब, संशोधित करें actionContact का कार्य SiteController।
public function actionContact() {
$model = new ContactForm(); $model->scenario = ContactForm::SCENARIO_EMAIL_FROM_GUEST;
if ($model->load(Yii::$app->request->post()) && $model-> contact(Yii::$app->params ['adminEmail'])) {
Yii::$app->session->setFlash('contactFormSubmitted'); return $this->refresh();
}
return $this->render('contact', [ 'model' => $model,
]);
}
Step 3 - टाइप करें http://localhost:8080/index.php?r=site/contactवेब ब्राउज़र में। आप देखेंगे कि वर्तमान में, सभी मॉडल विशेषताओं की आवश्यकता है।
Step 4 - यदि आप में मॉडल का परिदृश्य बदलते हैं actionContact, जैसा कि निम्नलिखित कोड में दिया गया है, आप पाएंगे कि नाम विशेषता की अब आवश्यकता नहीं है।
$model->scenario = ContactForm::SCENARIO_EMAIL_FROM_USER;
बड़े पैमाने पर असाइनमेंट
बड़े पैमाने पर असाइनमेंट कोड की एक पंक्ति के माध्यम से कई इनपुट विशेषताओं से एक मॉडल बनाने का एक सुविधाजनक तरीका है।
कोड की पंक्तियाँ हैं -
$mContactForm = new \app\models\ContactForm;
$mContactForm->attributes = \Yii::$app->request->post('ContactForm');
कोड की उपरोक्त दी गई रेखाएँ इसके समकक्ष हैं -
$mContactForm = new \app\models\ContactForm; $postData = \Yii::$app->request->post('ContactForm', []); $mContactForm->name = isset($postData['name']) ? $postData['name'] : null;
$mContactForm->email = isset($postData['email']) ? $postData['email'] : null; $mContactForm->subject = isset($postData['subject']) ? $postData['subject'] : null;
$mContactForm->body = isset($postData['body']) ? $postData['body'] : null;
पूर्व ज्यादा साफ है। नोटिस जोmassive assignment पर लागू होता है safe attributes। वे केवल वर्तमान परिदृश्य विशेषता में सूचीबद्ध हैंscenario() समारोह।
डेटा निर्यात
मॉडल को अक्सर विभिन्न स्वरूपों में निर्यात करने की आवश्यकता होती है। मॉडल को एक सरणी में बदलने के लिए, संशोधित करेंactionShowContactModel का कार्य SiteController -
public function actionShowContactModel() {
$mContactForm = new \app\models\ContactForm();
$mContactForm->name = "contactForm"; $mContactForm->email = "[email protected]";
$mContactForm->subject = "subject"; $mContactForm->body = "body";
var_dump($mContactForm->attributes);
}
प्रकार http://localhost:8080/index.php?r=site/show-contact-model पता बार में और आप निम्नलिखित देखेंगे -
मॉडल को परिवर्तित करने के लिए JSON प्रारूप, संशोधित करें actionShowContactModel निम्नलिखित तरीके से कार्य -
public function actionShowContactModel() {
$mContactForm = new \app\models\ContactForm();
$mContactForm->name = "contactForm"; $mContactForm->email = "[email protected]";
$mContactForm->subject = "subject"; $mContactForm->body = "body";
return \yii\helpers\Json::encode($mContactForm);
}
Browser output -
{
"name":"contactForm",
"email":"[email protected]",
"subject":"subject",
"body":"body ",
"verifyCode":null
}
महत्वपूर्ण बिंदु
मॉडल आमतौर पर अच्छी तरह से डिज़ाइन किए गए एप्लिकेशन में नियंत्रकों की तुलना में बहुत तेज़ होते हैं। मॉडल चाहिए -
- व्यवसायिक तर्क देता है।
- सत्यापन नियमों को नियंत्रित करता है।
- कंटेनर विशेषताएँ।
- HTML एम्बेड न करें।
- सीधे पहुँच अनुरोध नहीं।
- बहुत अधिक परिदृश्य नहीं हैं।