Yii-models
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 *-次のコードを使用して、 *SiteController に actionShowContactModel という関数を作成します。
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 *-次に、 *SiteController の actionContact 関数を変更します。
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()*関数にリストされている現在のシナリオ属性です。
データエクスポート
多くの場合、モデルはさまざまな形式でエクスポートする必要があります。 モデルを配列に変換するには、 SiteController の actionShowContactModel 関数を変更します-
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を埋め込みません。
- リクエストに直接アクセスしません。
- シナリオが多すぎません。