Yii - Model

Model adalah objek yang mewakili logika dan aturan bisnis. Untuk membuat model, Anda harus memperpanjangyii\base\Model kelas atau subkelasnya.

Atribut

Atribut mewakili data bisnis. Mereka dapat diakses seperti elemen array atau properti objek. Setiap atribut adalah properti model yang dapat diakses publik. Untuk menentukan atribut apa yang dimiliki model, Anda harus menggantiyii\base\Model::attributes() metode.

Mari kita lihat ContactForm model template aplikasi dasar.

<?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 - Buat fungsi yang disebut actionShowContactModel dalam SiteController dengan kode berikut.

public function actionShowContactModel() { 
   $mContactForm = new \app\models\ContactForm(); $mContactForm->name = "contactForm"; 
   $mContactForm->email = "[email protected]"; $mContactForm->subject = "subject"; 
   $mContactForm->body = "body"; var_dump($mContactForm); 
}

Dalam kode di atas, kami mendefinisikan ContactForm model, mengatur atribut, dan menampilkan model di layar.

Step 2 - Sekarang, jika Anda mengetik http://localhost:8080/index.php?r=site/show-contact-model di bilah alamat browser web, Anda akan melihat yang berikut ini.

Jika model Anda berasal dari yii\base\Model, maka semua variabel anggotanya (publik dan non-statis) adalah atribut. Ada lima atribut diContactForm model - nama, email, subjek, badan, verifyCode dan Anda dapat dengan mudah menambahkan yang baru.

Label Atribut

Anda sering kali perlu menampilkan label yang terkait dengan atribut. Secara default, label atribut secara otomatis dibuat olehyii\base\Model::generateAttributeLabel()metode. Untuk mendeklarasikan label atribut secara manual, Anda dapat menggantiyii\base\Model::attributeLabels() metode.

Step 1 - Jika Anda membuka http://localhost:8080/index.php?r=site/contact, Anda akan melihat halaman berikut.

Perhatikan bahwa label atribut sama dengan namanya.

Step 2 - Sekarang, modifikasi file attributeLabels berfungsi di ContactForm model dengan cara berikut.

public function attributeLabels() {
   return [
      'name' => 'name overridden',
      'email' => 'email overridden',
      'subject' => 'subject overridden',
      'body' => 'body overridden',
      'verifyCode' => 'verifyCode overridden',
   ];
}

Step 3 - Jika Anda membuka http://localhost:8080/index.php?r=site/contact sekali lagi, Anda akan melihat bahwa label telah berubah seperti yang ditunjukkan pada gambar berikut.

Skenario

Anda dapat menggunakan model dalam berbagai skenario. Misalnya, ketika seorang tamu ingin mengirim formulir kontak, kita memerlukan semua atribut model. Ketika seorang pengguna ingin melakukan hal yang sama, dia sudah masuk, jadi kami tidak memerlukan namanya, karena kami dapat dengan mudah mengambilnya dari DB.

Untuk mendeklarasikan skenario, kita harus mengganti scenarios()fungsi. Ia mengembalikan sebuah array yang kuncinya adalah nama dan nilai skenarioactive attributes. Atribut aktif adalah yang akan divalidasi. Bisa jugamassively assigned.

Step 1 - Ubah ContactForm model dengan cara berikut.

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

Kami telah menambahkan dua skenario. Satu untuk tamu dan satu lagi untuk pengguna terautentikasi. Saat pengguna diautentikasi, kami tidak membutuhkan namanya.

Step 2 - Sekarang, modifikasi file actionContact fungsi dari 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 - Ketik http://localhost:8080/index.php?r=site/contactdi browser web. Anda akan melihat bahwa saat ini, semua atribut model diperlukan.

Step 4 - Jika Anda mengubah skenario model di file actionContact, seperti yang diberikan dalam kode berikut, Anda akan menemukan bahwa atribut name tidak lagi diperlukan.

$model->scenario = ContactForm::SCENARIO_EMAIL_FROM_USER;

Tugas Besar-besaran

Penetapan besar-besaran adalah cara mudah untuk membuat model dari beberapa atribut masukan melalui satu baris kode.

Baris kodenya adalah -

$mContactForm = new \app\models\ContactForm; 
$mContactForm->attributes = \Yii::$app->request->post('ContactForm');

Baris kode yang diberikan di atas sama dengan -

$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;

Yang pertama jauh lebih bersih. Perhatikan itumassive assignment hanya berlaku untuk safe attributes. Mereka hanyalah atribut skenario saat ini yang tercantum discenario() fungsi.

Ekspor Data

Model sering kali perlu diekspor dalam format yang berbeda. Untuk mengubah model menjadi larik, modifikasiactionShowContactModel fungsi dari 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);
}

Tipe http://localhost:8080/index.php?r=site/show-contact-model di bilah alamat dan Anda akan melihat yang berikut -

Untuk mengonversi Model menjadi JSON format, ubah actionShowContactModel berfungsi dengan cara berikut -

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
}

Poin Penting

Model biasanya jauh lebih cepat daripada pengontrol dalam aplikasi yang dirancang dengan baik. Model harus -

  • Berisi logika bisnis.
  • Berisi aturan validasi.
  • Berisi atribut.
  • Tidak menyematkan HTML.
  • Tidak secara langsung mengakses permintaan.
  • Tidak terlalu banyak skenario.