久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

Yii2中的場景(scenario)和驗證規則(rule)詳解

Yii2的rule用于對模型屬性進行驗證,scenario用戶定義不同場景下需要驗證的模型,下面這篇文章主要給大家介紹了關于Yii2中場景(scenario)和驗證規則(rule)的相關資料,文中通過示例代碼介

前言

場景,顧名思義,就是一個情景,一種場面。在yii2中也有場景,這個場景跟你所理解的場景含義差不多。

和用戶有交互的系統必不可少的功能包括收集用戶數據、校驗和處理。實際業務中,往往還需要將數據進行持久化存儲。出于安全考慮,開發人員應當牢牢把握“客戶端的輸入都是不可信”的準則,客戶端傳過來的數據先進行過濾和清洗后再存儲或傳遞到內部系統。

Yii2推薦使用Model類來收集和校驗用戶數據,持久化的ActiveRecord類是其子類。Model類的load和validate兩個方法,分別用來收集和校驗客戶端數據。哪些數據應該被收集,哪些數據需要在什么場景下驗證,便是本文的主題:場景(scenario)和驗證規則(rule)。

下面話不多說了,來隨著小編一起看看詳細的介紹吧。

系統結構

先引入一個簡單的業務系統:系統中存在學生和教師兩種角色,數據庫中使用了三張表保存角色信息:

user: [id, username, password, status, 其他通用屬性]

student: [id, user_id, student_no, grade, class, 其他學生屬性]

teacher: [id, user_id, work_no, title, telphone, 其他教師屬性]

實際業務不限于對這三張表的增刪查改操作。為了簡化問題,后續僅討論user和student兩張表的數據變更(給出teacher表是為了讓讀者不認為設計數據庫的人是腦殘:明明可以放到一張表的,為什么要拆開!)。

學生報名

學生報名是典型的增刪查改操作,送分題。學生報名的簡要代碼示例如下:

public function actionSignup()
{
 $data = Yii::$app->request->post();
 $user = new User();
 $user->load($data);
 if ($user->save()) {
  $student = new Student([
   "user_id" => $user->id,
  ]);
  $student->load($data);
  if ($student->save()) {
   // redirect to success page
  } else {
   $user->delete();
  }
 }
 // render error page
}

相信有Yii2使用經驗的人都能根據數據庫的字段約束快速的把User和Student類的rules方法寫出來。例如User類文件內容可能如下:

namespace app\models;
class User extends \yii\db\ActiveRecord
{
 public function rules()
 {
  return [   [["username", "password", "status",], "required"],
   ["username", "unique"],
   // other rules
  ];
 }
 // other method
}

定義數據的驗證規則,這是大多數人對rules的第一印象,并且是一個很好的印象:它打回非法的數據,讓正常的數據進入系統中。安全的實踐應該盡量定義完整的規則,充分驗證數據。也建議每一個Yii2開發人員對內置的核心校驗器熟悉。

修改信息

修改信息,也是典型的增刪查改操作。實現代碼和報名差別不大,這里僅討論兩點:

1、用戶密碼的驗證

注冊時會校驗用戶密碼是否8-16位,密碼的規則可能是: ["password", "string", "length" => [8, 16]] 。明文保存密碼是不可取的,插入數據庫時至少會做MD5加密,password變成32位。假設用戶修改信息時未修改密碼,再次保存時密碼規則校驗出錯(長度不符合),無法保存!

怎么解決這個問題呢?翻閱Yii文檔,發現了規則中的when屬性可以救場。一種可能的驗證規則是:

public function rules()
{
 return [
   ["password", "string", "length" => [8, 16], 'when' => function ($model) {
    return $model->isNewRecord;
   }],
   // other rules
  ];

只有在注冊(新增數據)時才校驗密碼字段。問題解決,完美!

2、防止用戶私自改密碼

假設有個小聰明的家伙(例如湯姆),發現系統是用Yii框架做的,想搞點小破壞炫耀一下水平。在發送修改信息的表單時,湯姆增加&password=12345678這一段數據。系統使用$user->load($data)收集用戶輸入,更新password字段,帶來如下后果:rules設置更新時不校驗密碼字段,12345678直接作為password的值保存到數據庫中。這個操作帶來連鎖反應:用戶再次登錄時,加密過后的密碼與數據庫中的明文密碼不匹配,導致湯姆無法登錄系統。煩人的是湯姆是個刺頭,登錄不上后整天騷擾客服,不省心!

怎么樣防止這種情況出現呢?一種解決的方法是阻止修改密碼:

unset($data["password"]); 
$user->load($data);
// 或者
$password = $user->password;
$user->load($data);
$user->password = $password;

把用戶輸入的密碼過濾掉,私自修改密碼的問題就解決了。

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

本篇文章主要介紹了淺談使用 Yii2 AssetBundle 中 $publishOptions 的正確姿勢,具有一定的參考價值,感興趣的小伙伴們可以參考一下
這篇文章主要介紹了Yii2之組件的注冊與創建的實現方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
這篇文章主要介紹了Yii2使用駝峰命名的形式訪問控制器的實現方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
下面小編就為大家帶來一篇Yii2使用駝峰命名的形式訪問控制器(實例講解)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
這篇文章主要介紹了Yii2.0實現生成二維碼功能,結合實例形式分析了Yii2.0框架生成二維碼所涉及的相關擴展引入步驟與使用方法,需要的朋友可以參考下
這篇文章主要介紹了Yii2框架實現登錄、退出及自動登錄功能的方法,結合實例形式詳細分析了Yii2框架實現登錄、退出及自動登錄功能的原理、實現方法與相關操作注意事項,需要的朋友可
主站蜘蛛池模板: 韩日精品一区 | 国产一区欧美 | 国产精品久久99 | 国产精品久久久久av | 久久精彩| 久久亚洲一区 | 欧美不卡视频一区发布 | 国产精品99久久久久久www | 91色视频在线观看 | a中文在线视频 | 欧美一a一片一级一片 | 午夜精品一区二区三区在线观看 | 亚洲在线一区 | 久久久国产精品视频 | 久久精品av麻豆的观看方式 | 91福利电影在线观看 | 新超碰97 | 美人の美乳で授乳プレイ | 最新中文字幕在线播放 | 亚洲激情综合 | 亚洲精品二区 | 综合网视频 | 婷婷色在线播放 | 免费午夜电影 | 欧美亚洲国产精品 | 国产主播第一页 | 国产91网站在线观看 | 亚洲成人动漫在线观看 | 99精品久久久 | 青青久草 | 女人av | 视频一区二区中文字幕 | 99这里只有精品 | 中文字幕在线网 | 91在线视频免费观看 | 国产网站在线播放 | 精品国产一区二区三区成人影院 | 亚洲精品乱码8久久久久久日本 | 成人午夜视频在线观看 | 西西裸体做爰视频 | 日韩 国产 在线 |