Yii-models

提供:Dev Guides
移動先:案内検索

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

ステップ1 *-次のコードを使用して、 *SiteControlleractionShowContactModel という関数を作成します。

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 モデルを定義し、属性を設定して、画面にモデルを表示します。

ステップ2 *-Webブラウザのアドレスバーに *http://localhost:8080/index.php?r = site/show-contact-model と入力すると、次のように表示されます。

連絡先ビューを表示

モデルが yii \ base \ Model から拡張されている場合、そのすべてのメンバー変数(パブリックおよび非静的)は属性です。 ContactForm モデルには、名前、電子メール、件名、本文、 verifyCode の5つの属性があり、新しい属性を簡単に追加できます。

属性ラベル

多くの場合、属性に関連付けられたラベルを表示する必要があります。 デフォルトでは、属性ラベルは* yii \ base \ Model
generateAttributeLabel()メソッドによって自動的に生成されます。 属性ラベルを手動で宣言するには、 yii \ base \ Model :: attributeLabels()*メソッドをオーバーライドできます。

ステップ1 *- http://localhost:8080/index.php?r = site/contactを開くと、次のページが表示されます。

お問い合わせフォーム

属性ラベルは名前と同じであることに注意してください。

ステップ2 *-次に、 *ContactForm モデルの attributeLabels 関数を次のように変更します。

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

ステップ3 *- *http://localhost:8080/index.php?r = site/contact を再度開くと、次の図に示すようにラベルが変更されていることがわかります。

連絡先が変更されました

シナリオ

さまざまなシナリオでモデルを使用できます。 たとえば、ゲストが連絡先フォームを送信する場合、すべてのモデル属性が必要です。 ユーザーが同じことをしたいときは、すでにログインしているので、DBから簡単に取得できるため、名前は必要ありません。

シナリオを宣言するには、* scenarios()*関数をオーバーライドする必要があります。 キーがシナリオ名であり、値が*アクティブな属性*である配列を返します。 アクティブな属性は検証する属性です。 また、*大量に*割り当てることもできます。

ステップ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;
      }
   }
?>

2つのシナリオを追加しました。 1つはゲスト用で、もう1つは認証済みユーザー用です。 ユーザーが認証される場合、ユーザーの名前は必要ありません。

ステップ2 *-次に、 *SiteControlleractionContact 関数を変更します。

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,
   ]);
}

ステップ3 *-Webブラウザに *http://localhost:8080/index.php?r = site/contact と入力します。 現在、すべてのモデル属性が必要であることがわかります。

必要なモデル属性

ステップ4 *-次のコードに示すように、 *actionContact でモデルのシナリオを変更すると、name属性は不要になります。

$model->scenario = ContactForm::SCENARIO_EMAIL_FROM_USER;

シナリオの変更

大規模な割り当て

大量の割り当ては、1行のコードで複数の入力属性からモデルを作成する便利な方法です。

コードの行は-

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

前者はずっときれいです。 大規模な割り当て*は*安全な属性*にのみ適用されることに注意してください。 これらは、 scenario()*関数にリストされている現在のシナリオ属性です。

データエクスポート

多くの場合、モデルはさまざまな形式でエクスポートする必要があります。 モデルを配列に変換するには、 SiteControlleractionShowContactModel 関数を変更します-

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

ブラウザ出力-

{
   "name":"contactForm",
   "email":"[email protected]",
   "subject":"subject",
   "body":"body ",
   "verifyCode":null
}

重要なポイント

モデルは通常、適切に設計されたアプリケーションのコントローラーよりもはるかに高速です。 モデルは-

  • ビジネスロジックが含まれています。
  • 検証ルールが含まれます。
  • 属性を含む。
  • HTMLを埋め込みません。
  • リクエストに直接アクセスしません。
  • シナリオが多すぎません。