成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Yii2系列教程七:Behaviors And Validations

fasss / 2819人閱讀

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

  

原文來自:https://jellybool.com/post/programming-with-yii2-behaviors-and-validat...

這一篇文章的開頭就無需多言了,緊接著上一篇的內(nèi)容和計劃,這一篇我們來說說Yii2的Behavior和Validations。

Behavior

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

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

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

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

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

./yii migrate/create extend_status_table_for_updated_by


執(zhí)行完上面的命令之后,來到相對應(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"); }

這個時候先不急著運行./yii migrate/up,因為這時候你運行./yii migrate/up其實是會報錯的,因為對于已創(chuàng)建的status來說,它updated_by字段會默認(rèn)為0,但是這個值在user這張表中并不存在。所以我們首先需要將status表中的幾條數(shù)據(jù)刪掉。鑒于這只是一個演示的小應(yīng)用,為了保險起見,我將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這個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)中,第一個就是使用Yii2的BlameableBehavior自動完成created_byupdated_by這兩個字段,至于timestamp這個數(shù)組,就是使用Yii2的TimestampBehavior來自動完成created_at和updated_at字段,并且這會根據(jù)數(shù)據(jù)的BEFORE_INSERTBEFORE_UPDATE兩種情況來自動完成添加。

需要注意的是,我們這時候需要在Status中引入下面兩個類:

use yiiehaviorsBlameableBehavior;
use yiidbActiveRecord;

這些工作都完成之后,我們就可以將我們原來在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,
        ]);
    }

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

點擊創(chuàng)建按鈕,你依然可以看到下面這個可愛的頁面:

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

Validations

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

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

這里我想說明的一點是,在Yii2之中,Validation通常都是通過validate()來實現(xiàn)的,那么這個`validate()`` 方法的背后其實是怎么樣的呢?可以看看下面這個順序:

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

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

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

./yii migrate/create create_sample_table

然后還是想之前一樣,來到相對應(yīng)的migration文件當(dāng)中,實現(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文件:

然后打開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驗證

我門修改一下rules()方法里面的occurred字段的驗證,給它設(shè)置一個默認(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)建一個新的Sample的時候,如果我們將occurred字段保留為空,那么這個字段就會默認(rèn)取值為當(dāng)天的日期。

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

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

下一節(jié)

再詳細(xì)講講Validations吧,這一節(jié)寫下來貌似Validations要說的實在有點多。

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

Happy Hacking

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/21058.html

相關(guān)文章

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

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

    xiaochao 評論0 收藏0
  • Yii2.0 RESTful API 之速率限制

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

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

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

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

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

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

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

    callmewhy 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<