摘要:原文來(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.php的actionCreate方法實(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_by和updated_by這兩個(gè)字段,至于timestamp這個(gè)數(shù)組,就是使用Yii2的TimestampBehavior來(lái)自動(dòng)完成created_at和updated_at字段,并且這會(huì)根據(jù)數(shù)據(jù)的BEFORE_INSERT和BEFORE_UPDATE兩種情況來(lái)自動(dòng)完成添加。
需要注意的是,我們這時(shí)候需要在Status中引入下面兩個(gè)類:
use yiiehaviorsBlameableBehavior; use yiidbActiveRecord;
這些工作都完成之后,我們就可以將我們?cè)瓉?lái)在controllers/StatusController.php的actionCreate方法的相關(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
ValidationsYii2的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
摘要:而這些問(wèn)題目前的最好解決方案就是集成一個(gè)編輯器,鑒于大家這里不是指程序員都是喜歡所見(jiàn)即所得,所以,這里我主要是演示怎么集成所見(jiàn)即所得的富文本編輯器。 原文來(lái)自: https://jellybool.com/post/programming-with-yii2-rich-text-input-with-redactor 首先,很慚愧的是,前幾天都出去外面玩了,沒(méi)有及時(shí)更新教程,...
摘要:之速率限制什么是速率限制權(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í)...
摘要:原文來(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)證和登錄,這一篇文章按照...
摘要:大家知道我最近在給阿北的知識(shí)分享微信小程序改版,使用的是中的功能,接下來(lái)把遇到的一些問(wèn)題及小技巧分享一下。小結(jié)以上就是目前為止在使用的開(kāi)發(fā)小程序時(shí)候使用的一些知識(shí)和技巧,希望對(duì)你有用,以后如果有再分享哈。 大家知道我最近在給阿北的知識(shí)分享微信小程序改版,使用的是yii2中的restful功能,接下來(lái)把遇到的一些問(wèn)題及小技巧分享一下。 先安利一下小程序碼 鏈接 開(kāi)始分享。 URL要重寫 ...
摘要:首先,在的主配置文件里先設(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ú)法支持高...
閱讀 2601·2021-11-15 11:38
閱讀 2618·2021-11-04 16:13
閱讀 17981·2021-09-22 15:07
閱讀 1014·2019-08-30 15:55
閱讀 3261·2019-08-30 14:15
閱讀 1663·2019-08-29 13:59
閱讀 3207·2019-08-28 18:28
閱讀 1575·2019-08-23 18:29