Yii 2シリーズチュートリアル7:Behaviors And Validations
8802 ワード
原文:https://jellybool.com/post/programming-with-yii2-behaviors-and-validat...
この文章の冒頭は言うまでもなく、前回の内容と計画に続いて、Yii 2のBehaviorとValidationsについてお話しします.
Behavior
まず、Behaviorといえば、Yii 2ではBehaviorは主によく使われるModelフィールドで自動化され、タイムスタンプフィールドを自動的に追加するなど、記録を保存する必要がある場所ごとにタイムスタンプのコードを書く必要がなくなります.例えば、Yii 2シリーズチュートリアル5:簡単なユーザー権限管理における
これらは実際には
OK、それなら、実現しましょう.
まず、statusテーブルに
上記のコマンドを実行した後、対応する
このとき、
次に、
データテーブルの作成が完了したら、
この場合、
これらの作業が完了すると、
注記を削除すると、
作成ボタンをクリックすると、次のかわいいページが表示されます.
ここまで、私たちのBehaviorはYii 2ですでに実現しました.次にValidationsを見てみましょう
Validations
Yii 2のValidationでは、一般的なemail、画像、数字など、さまざまな検証メカニズムと条件を提供しています.ここでドキュメントを表示することができます.
http://www.yiiframework.com/doc-2.0/yii-validators-validator.html
ここで私が説明したいのは、Yii 2では、Validationは通常
プレゼンテーションの便宜上、新しいMigrationsを作成します.
その後、対応するmigrationファイルに来て、
次に、以下を実行します.
Giiを使用してModelファイルを生成するには:
CRUDファイルの再生成:
Default Value検証
rules()メソッドのoccurredフィールドの検証を変更し、デフォルト値を設定します.
次に、新しいSampleを作成するときに、
Rankは2を入力し、作成後は次のようになります.
別の検証ルールについては、
次のセクション
Validationsについてもっと詳しく話しましょう.この節はValidationsが言うことが多いようです.
Githubソース:https://github.com/JellyBool/helloYii
Happy Hacking
この文章の冒頭は言うまでもなく、前回の内容と計画に続いて、Yii 2のBehaviorとValidationsについてお話しします.
Behavior
まず、Behaviorといえば、Yii 2ではBehaviorは主によく使われるModelフィールドで自動化され、タイムスタンプフィールドを自動的に追加するなど、記録を保存する必要がある場所ごとにタイムスタンプのコードを書く必要がなくなります.例えば、Yii 2シリーズチュートリアル5:簡単なユーザー権限管理における
controllers/StatusController.php
のactionCreate
メソッドで実装された $model->created_by = Yii::$app->user->getId();//add this line
$model->created_at = time();
$model->updated_at = time();
これらは実際には
Status
というModelのbehaviors()
メソッドの中に直接置くことができます.OK、それなら、実現しましょう.
まず、statusテーブルに
updated_by
フィールドを追加して、どのユーザーがステータスを更新したかを記録する必要があります../yii migrate/create extend_status_table_for_updated_by
上記のコマンドを実行した後、対応する
migration
ファイルに移動し、up()
およびdown()
メソッドに次のコードを追加します.
public function up()
{
$this->addColumn('{{%status}}','updated_by',Schema::TYPE_INTEGER.' NOT NULL');
$this->addForeignKey('fk_status_updated_by', '{{%status}}', 'updated_by', '{{%user}}', 'id', 'CASCADE', 'CASCADE');
}
public function down()
{
$this->dropForeignKey('fk_status_updated_by','{{%status}}');
$this->dropColumn('{{%status}}','updated_by');
}
このとき、
./yii migrate/up
を急いで実行しないでください.このとき、./yii migrate/up
を実行すると、実際にはエラーが表示されます.作成したstatusの場合、updated_by
フィールドはデフォルトで0になりますが、この値はuser
という表には存在しません.まず、status
表のいくつかのデータを削除する必要があります.これは単なるプレゼンテーションの小さなアプリケーションであるため、保険のためにstutas
という表を削除し、migration
という表の以下に類似する2つの記録を削除して、Yii 2のmigrationがstutas
表を再作成する目的を達成しました.m150804_035107_create_status_table
m150806_034325_extend_status_table_for_created_by
次に、
./yii migrate/up
を実行します../yii migrate/up
Yii Migration Tool (based on Yii v2.0.6)
Total 3 new migrations to be applied:
m150804_035107_create_status_table
m150806_034325_extend_status_table_for_created_by
m150812_142736_extend_status_table_for_updated_by
Apply the above migrations? (yes|no) [no]:yes
*** applying m150804_035107_create_status_table
> create table {{%status}} ... done (time: 0.025s)
*** applied m150804_035107_create_status_table (time: 0.033s)
*** applying m150806_034325_extend_status_table_for_created_by
> add column created_by integer NOT NULL to table {{%status}} ... done (time: 0.036s)
> add foreign key fk_status_created_by: {{%status}} (created_by) references {{%user}} (id) ... done (time: 0.014s)
*** applied m150806_034325_extend_status_table_for_created_by (time: 0.053s)
*** applying m150812_142736_extend_status_table_for_updated_by
> add column updated_by integer NOT NULL to table {{%status}} ... done (time: 0.017s)
> add foreign key fk_status_updated_by: {{%status}} (updated_by) references {{%user}} (id) ... done (time: 0.017s)
*** applied m150812_142736_extend_status_table_for_updated_by (time: 0.037s)
データテーブルの作成が完了したら、
Status
というModelファイルにbehaviorsメソッドを追加する必要があります.public function behaviors()
{
return [
[
'class' => BlameableBehavior::className(),
'createdByAttribute' => 'created_by',
'updatedByAttribute' => 'updated_by',
],
'timestamp' => [
'class' => 'yii\behaviors\TimestampBehavior',
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
],
],
];
}
return
の配列のうち、1つ目はYii 2のBlameableBehavior
を使用してcreated_by
とupdated_by
の2つのフィールドを自動的に完了することであり、timestamp
という配列については、Yii 2のTimestampBehavior
を使用してcreated_を自動的に完了することである.atおよびupdated_at
フィールドは、データのBEFORE_INSERT
およびBEFORE_UPDATE
の両方の状況に応じて自動的に追加が完了する.この場合、
Status
に次の2つのクラスを導入する必要があります.use yii\behaviors\BlameableBehavior;
use yii\db\ActiveRecord;
これらの作業が完了すると、
controllers/StatusController.php
のactionCreate
メソッドに関連するいくつかの行を注釈することができます.public function actionCreate()
{
$model = new Status();
if ($model->load(Yii::$app->request->post())) {
/* $model->created_by = Yii::$app->user->getId();
$model->created_at = time();
$model->updated_at = time();*/
if ($model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
}
}
return $this->render('create', [
'model' => $model,
]);
}
注記を削除すると、
http://localhost:8999/status/create
にアクセスして、新しいstatus
を作成してみましょう.作成ボタンをクリックすると、次のかわいいページが表示されます.
ここまで、私たちのBehaviorはYii 2ですでに実現しました.次にValidationsを見てみましょう
Validations
Yii 2のValidationでは、一般的なemail、画像、数字など、さまざまな検証メカニズムと条件を提供しています.ここでドキュメントを表示することができます.
http://www.yiiframework.com/doc-2.0/yii-validators-validator.html
ここで私が説明したいのは、Yii 2では、Validationは通常
validate()
で実現されていますが、この`validate()```方法の背後にはどうなっているのでしょうか.次の順序を見てみましょう.1. Model `scenarios()` , ,
2. Model `rules()` ,
プレゼンテーションの便宜上、新しいMigrationsを作成します.
./yii migrate/create create_sample_table
その後、対応するmigrationファイルに来て、
up()
とdown()
の方法を実現したいと思っています.public function up()
{
$tableOptions = null;
if ($this->db->driverName === 'mysql') {
$tableOptions = 'CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB';
}
$this->createTable('{{%sample}}', [
'id' => Schema::TYPE_PK,
'thought' => Schema::TYPE_STRING.' NOT NULL DEFAULT ""',
'goodness' => Schema::TYPE_SMALLINT . ' NOT NULL DEFAULT 0',
'rank' => Schema::TYPE_INTEGER . ' NOT NULL',
'censorship' => Schema::TYPE_STRING . ' NOT NULL',
'occurred' => Schema::TYPE_DATE . ' NOT NULL',
], $tableOptions);
}
public function down()
{
$this->dropTable('{{%sample}}');
}
次に、以下を実行します.
./yii migrate/up
Yii Migration Tool (based on Yii v2.0.6)
Total 1 new migration to be applied:
m150812_153139_create_sample_table
Apply the above migration? (yes|no) [no]:yes
*** applying m150812_153139_create_sample_table
> create table {{%sample}} ... done (time: 0.026s)
*** applied m150812_153139_create_sample_table (time: 0.037s)
Giiを使用してModelファイルを生成するには:
CRUDファイルの再生成:
SampleController.php
を開くと、Yii 2が生成したrules()
が表示されます. public function rules()
{
return [
[['goodness', 'rank'], 'integer'],
[['rank', 'censorship', 'occurred'], 'required'],
[['occurred'], 'safe'],
[['thought', 'censorship'], 'string', 'max' => 255]
];
}
Default Value検証
rules()メソッドのoccurredフィールドの検証を変更し、デフォルト値を設定します.
return [
[['goodness', 'rank'], 'integer'],
[['rank', 'censorship'], 'required'],
// Gii generate this
//[['occurred'], 'safe'],
['occurred', 'default', 'value' => date('Y-m-d')],
[['thought', 'censorship'], 'string', 'max' => 255]
];
次に、新しいSampleを作成するときに、
occurred
フィールドを空白のままにすると、このフィールドはデフォルトで当日の日付になります.Rankは2を入力し、作成後は次のようになります.
別の検証ルールについては、
rules()
メソッドのルールを自分で変更して、対応する検証を行ってみてください.次のセクション
Validationsについてもっと詳しく話しましょう.この節はValidationsが言うことが多いようです.
Githubソース:https://github.com/JellyBool/helloYii
Happy Hacking