国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Yii2系列教程七:Behaviors And Validations

fasss / 2812人閱讀

摘要:原文來(lái)自這一篇文章的開(kāi)頭就無(wú)需多言了,緊接著上一篇的內(nèi)容和計(jì)劃,這一篇我們來(lái)說(shuō)說(shuō)的和。,那既然這樣,我們就來(lái)實(shí)現(xiàn)一下唄。所以我們首先需要將表中的幾條數(shù)據(jù)刪掉。下一節(jié)再詳細(xì)講講吧,這一節(jié)寫下來(lái)貌似要說(shuō)的實(shí)在有點(diǎn)多。

  

原文來(lái)自:https://jellybool.com/post/programming-with-yii2-behaviors-and-validat...

這一篇文章的開(kāi)頭就無(wú)需多言了,緊接著上一篇的內(nèi)容和計(jì)劃,這一篇我們來(lái)說(shuō)說(shuō)Yii2的Behavior和Validations。

Behavior

首先我們來(lái)說(shuō)說(shuō)Behavior,在Yii2中Behavior主要是可以用于一些常用的Model字段當(dāng)中,對(duì)其進(jìn)行自動(dòng)化操作,比如自動(dòng)添加一些時(shí)間戳字段等,這樣我們就不用在每一個(gè)需要保存記錄的地方分別寫生成時(shí)間戳的代碼了,比如前面我們?cè)赮ii2系列教程五:簡(jiǎn)單的用戶權(quán)限管理中的controllers/StatusController.phpactionCreate方法實(shí)現(xiàn)的

    $model->created_by = Yii::$app->user->getId();//add this line
    $model->created_at = time();
    $model->updated_at = time();

這些其實(shí)我們都是可以直接放在Status這個(gè)Model的behaviors()方法當(dāng)中自動(dòng)完成的。

OK,那既然這樣,我們就來(lái)實(shí)現(xiàn)一下唄。

首先我們需要來(lái)喂我們的status表增加一個(gè)updated_by字段,用來(lái)記錄是哪個(gè)用戶對(duì)一條狀態(tài)進(jìn)行了更新:

./yii migrate/create extend_status_table_for_updated_by


執(zhí)行完上面的命令之后,來(lái)到相對(duì)應(yīng)的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"); }

這個(gè)時(shí)候先不急著運(yùn)行./yii migrate/up,因?yàn)檫@時(shí)候你運(yùn)行./yii migrate/up其實(shí)是會(huì)報(bào)錯(cuò)的,因?yàn)閷?duì)于已創(chuàng)建的status來(lái)說(shuō),它updated_by字段會(huì)默認(rèn)為0,但是這個(gè)值在user這張表中并不存在。所以我們首先需要將status表中的幾條數(shù)據(jù)刪掉。鑒于這只是一個(gè)演示的小應(yīng)用,為了保險(xiǎn)起見(jiàn),我將stutas這張表刪除了,并且將migration這張表的于下面類似的兩條記錄刪掉,以達(dá)到Y(jié)ii2的migration重新創(chuàng)建stutas表的目的:

m150804_035107_create_status_table
m150806_034325_extend_status_table_for_created_by

然后再執(zhí)行./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)

數(shù)據(jù)表創(chuàng)建完成之后,我們需要在Status這個(gè)Model文件中增加我們的behaviors方法:

public function behaviors()
    {
        return [
            [
                "class" => BlameableBehavior::className(),
                "createdByAttribute" => "created_by",
                "updatedByAttribute" => "updated_by",
            ],
            "timestamp" => [
                "class" => "yiiehaviorsTimestampBehavior",
                "attributes" => [
                    ActiveRecord::EVENT_BEFORE_INSERT => ["created_at", "updated_at"],
                    ActiveRecord::EVENT_BEFORE_UPDATE => ["updated_at"],
                ],
            ],
        ];
    }

return的數(shù)組當(dāng)中,第一個(gè)就是使用Yii2的BlameableBehavior自動(dòng)完成created_byupdated_by這兩個(gè)字段,至于timestamp這個(gè)數(shù)組,就是使用Yii2的TimestampBehavior來(lái)自動(dòng)完成created_at和updated_at字段,并且這會(huì)根據(jù)數(shù)據(jù)的BEFORE_INSERTBEFORE_UPDATE兩種情況來(lái)自動(dòng)完成添加。

需要注意的是,我們這時(shí)候需要在Status中引入下面兩個(gè)類:

use yiiehaviorsBlameableBehavior;
use yiidbActiveRecord;

這些工作都完成之后,我們就可以將我們?cè)瓉?lái)在controllers/StatusController.phpactionCreate方法的相關(guān)那幾行注釋掉了:

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

注釋掉之后,我們可以訪問(wèn)http://localhost:8999/status/create 來(lái)創(chuàng)建一條新的status來(lái)看看:

點(diǎn)擊創(chuàng)建按鈕,你依然可以看到下面這個(gè)可愛(ài)的頁(yè)面:

到這里,我們的Behavior在Yii2中就已經(jīng)實(shí)現(xiàn)完畢了。下面來(lái)看看Validations

Validations

Yii2的Validation提供多種多樣的驗(yàn)證機(jī)制,比如常見(jiàn)的email,圖片,數(shù)字等,更多的驗(yàn)證機(jī)制和條件,你可以到這里查看文檔:

http://www.yiiframework.com/doc-2.0/yii-validators-validator.html

這里我想說(shuō)明的一點(diǎn)是,在Yii2之中,Validation通常都是通過(guò)validate()來(lái)實(shí)現(xiàn)的,那么這個(gè)`validate()`` 方法的背后其實(shí)是怎么樣的呢?可以看看下面這個(gè)順序:

1. 首先檢測(cè)Model當(dāng)中有沒(méi)有`scenarios()`方法,如果該方法存在,則首先執(zhí)行該方法里面對(duì)應(yīng)的場(chǎng)景之下的驗(yàn)證規(guī)則

2. 再檢測(cè)Model當(dāng)中的`rules()`方法,然后執(zhí)行驗(yàn)證規(guī)則

為了演示方便,我們來(lái)創(chuàng)建一個(gè)新的Migrations:

./yii migrate/create create_sample_table

然后還是想之前一樣,來(lái)到相對(duì)應(yīng)的migration文件當(dāng)中,實(shí)現(xiàn)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}}");
    }


然后執(zhí)行之:

./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文件:

然后打開(kāi)SampleController.php,你就可以看到Y(jié)ii2為我們生成的rules()了:

 public function rules()
    {
        return [
            [["goodness", "rank"], "integer"],
            [["rank", "censorship", "occurred"], "required"],
            [["occurred"], "safe"],
            [["thought", "censorship"], "string", "max" => 255]
        ];
    }

Default Value驗(yàn)證

我門修改一下rules()方法里面的occurred字段的驗(yàn)證,給它設(shè)置一個(gè)默認(rèn)值:

return [
            [["goodness", "rank"], "integer"],
            [["rank", "censorship"], "required"],
            // Gii generate this
            //[["occurred"], "safe"],
            ["occurred", "default", "value" => date("Y-m-d")],
            [["thought", "censorship"], "string", "max" => 255]
        ];

然后當(dāng)我們創(chuàng)建一個(gè)新的Sample的時(shí)候,如果我們將occurred字段保留為空,那么這個(gè)字段就會(huì)默認(rèn)取值為當(dāng)天的日期。

Rank填入2,然后創(chuàng)建后是這樣的:

至于另外的驗(yàn)證規(guī)則,你可以自己試著更改一下rules()方法里面的規(guī)則,然后進(jìn)行相應(yīng)的驗(yàn)證。

下一節(jié)

再詳細(xì)講講Validations吧,這一節(jié)寫下來(lái)貌似Validations要說(shuō)的實(shí)在有點(diǎn)多。

Github源碼:https://github.com/JellyBool/helloYii

Happy Hacking

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/21058.html

相關(guān)文章

  • Yii2系列教程六:集成編輯器

    摘要:而這些問(wèn)題目前的最好解決方案就是集成一個(gè)編輯器,鑒于大家這里不是指程序員都是喜歡所見(jiàn)即所得,所以,這里我主要是演示怎么集成所見(jiàn)即所得的富文本編輯器。 原文來(lái)自: https://jellybool.com/post/programming-with-yii2-rich-text-input-with-redactor 首先,很慚愧的是,前幾天都出去外面玩了,沒(méi)有及時(shí)更新教程,...

    xiaochao 評(píng)論0 收藏0
  • Yii2.0 RESTful API 之速率限制

    摘要:之速率限制什么是速率限制權(quán)威指南翻譯過(guò)來(lái)為限流,為防止濫用,你應(yīng)該考慮對(duì)您的限流。如果在規(guī)定的時(shí)間內(nèi)接收了一個(gè)用戶大量的請(qǐng)求,將返回響應(yīng)狀態(tài)代碼這意味著過(guò)多的請(qǐng)求。 Yii2.0 RESTful API 之速率限制 什么是速率限制? 權(quán)威指南翻譯過(guò)來(lái)為限流,為防止濫用,你應(yīng)該考慮對(duì)您的 API 限流。 例如,您可以限制每個(gè)用戶 10 分鐘內(nèi)最多調(diào)用 API 100 次。 如果在規(guī)定的時(shí)...

    LeviDing 評(píng)論0 收藏0
  • Yii2系列教程五:簡(jiǎn)單的用戶權(quán)限管理

    摘要:原文來(lái)自上一篇文章講了用戶的注冊(cè),驗(yàn)證和登錄,這一篇文章按照約定來(lái)說(shuō)說(shuō)之中的用戶和權(quán)限控制。探尋上面的一些列設(shè)置和代碼更改,已經(jīng)實(shí)現(xiàn)了一小部分的用戶控制登錄的用戶才能發(fā)表。 原文來(lái)自: https://jellybool.com/post/programming-with-yii2-user-access-controls 上一篇文章講了用戶的注冊(cè),驗(yàn)證和登錄,這一篇文章按照...

    livem 評(píng)論0 收藏0
  • 阿北的知識(shí)分享小程序中restful使用經(jīng)驗(yàn)貼

    摘要:大家知道我最近在給阿北的知識(shí)分享微信小程序改版,使用的是中的功能,接下來(lái)把遇到的一些問(wèn)題及小技巧分享一下。小結(jié)以上就是目前為止在使用的開(kāi)發(fā)小程序時(shí)候使用的一些知識(shí)和技巧,希望對(duì)你有用,以后如果有再分享哈。 大家知道我最近在給阿北的知識(shí)分享微信小程序改版,使用的是yii2中的restful功能,接下來(lái)把遇到的一些問(wèn)題及小技巧分享一下。 先安利一下小程序碼 鏈接 開(kāi)始分享。 URL要重寫 ...

    Meils 評(píng)論0 收藏0
  • Yii2配置Nginx反向代理緩存提高并發(fā)支持

    摘要:首先,在的主配置文件里先設(shè)置好與緩存相關(guān)的配置這里需要先手工建立與緩存相應(yīng)的目錄,并且把它設(shè)置為可讀寫。另外如果升級(jí)成,對(duì)不用緩存的部分性能也會(huì)有提升,這就不在本文討論的范圍之內(nèi)了。 現(xiàn)有一個(gè)系統(tǒng)是用Yii2框架開(kāi)發(fā)的,Web服務(wù)器采用Nginx+php-fpm,由于沒(méi)有使用Nginx的反向代理緩存技術(shù),用Apache的ab一壓就死掉了,QPS只能達(dá)到7或者8的水平,像這樣是無(wú)法支持高...

    callmewhy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<