Yii 2シリーズチュートリアル7:Behaviors And Validations


原文:https://jellybool.com/post/programming-with-yii2-behaviors-and-validat...
この文章の冒頭は言うまでもなく、前回の内容と計画に続いて、Yii 2のBehaviorとValidationsについてお話しします.
Behavior
まず、Behaviorといえば、Yii 2ではBehaviorは主によく使われるModelフィールドで自動化され、タイムスタンプフィールドを自動的に追加するなど、記録を保存する必要がある場所ごとにタイムスタンプのコードを書く必要がなくなります.例えば、Yii 2シリーズチュートリアル5:簡単なユーザー権限管理におけるcontrollers/StatusController.phpactionCreateメソッドで実装された
    $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_byupdated_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.phpactionCreateメソッドに関連するいくつかの行を注釈することができます.
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