abstract:一.模型的獲取器: 就是在獲取模型實例數(shù)據(jù)時自動觸發(fā)的模型方法. getFieldAttr($value,$data可選) 1.在模型文件中創(chuàng)建一個獲取器方法 對應(yīng)著一條數(shù)據(jù)的一個字段. getData()獲取某一字段的原始數(shù)據(jù)(獲取器處理之前的) 如獲取staff表中的
一.模型的獲取器: 就是在獲取模型實例數(shù)據(jù)時自動觸發(fā)的模型方法. getFieldAttr($value,$data可選)
1.在模型文件中創(chuàng)建一個獲取器方法 對應(yīng)著一條數(shù)據(jù)的一個字段. getData()獲取某一字段的原始數(shù)據(jù)(獲取器處理之前的)
如獲取staff表中的name字段,則在模型文件Staff.php中創(chuàng)建受保護的方法 getNameAttr($value,$data可選)方法 $value為獲取字段的值 $data為這條查詢數(shù)據(jù)的其他字段值 ,具體操作如下
protected function getSalaryAttr($value, $data) //當(dāng)獲取salary工資字段時自動觸發(fā) { return $data['name'].'的工資是:'.($value+250); //獲取工資字段返回的值 } /********************************************************************************/ //控制器中方法 public function gain() { $res = Staff::get(2); // dump($res); echo '<hr>'; echo $res->salary,'<br>'; echo $res->getData('salary'); //獲取某一字段的原始值 }
2.也可以為獲取不存在的字段時進行設(shè)置,如下
protected function getStaffInfoAttr($value,$data) //獲取不存在的字段staff_info { //staff_info;虛擬字段 //$value: 僅僅是一個占位符 return '我是'.$data['name'].'今年都'.$data['age'].'歲了,工資才'.$data['salary'].'好可憐啊'; } //控制器中方法 echo $res->staff_info,'<br>';
------------------------------------------------------------------------------------------------------------
二.模型修改器:就是在更新模型實例數(shù)據(jù)時自動觸發(fā)的模型方法. setFieldAttr($value,$date可選)
1.和獲取器幾乎相同,就是在更新數(shù)據(jù)時自動觸發(fā)
protected function setSalaryAttr($value,$data) //更新salary字段時自動觸發(fā) { return $value+$data['age']; //返回處理后的數(shù)據(jù) } //控制器中方法 $res = Staff::get(3); $res->salary = '4000'; $res->save(); /********************************************************************************/
三.模型的自動完成 : 針對寫操作,當(dāng)更新,新增(刪除通過軟刪除,也屬于更新) 相當(dāng)于給字段設(shè)置默認(rèn)值
1.設(shè)置三個繼承于think\Model類中的三個受保護的屬性 $insert [新增時設(shè)置], $update [更新時設(shè)置], 或者$auto [更新或者新增時都設(shè)置]
protected $insert = ['sex'=>0,'salary'=>1000]; //新增 protected $update = ['sex'=>0]; //更新 protected $auto = ['sex'=>0]; //新增和更新都設(shè)置 //控制器中方法 Staff::create(['name'=>'小滅絕','age'=>60]); Staff::update(['name'=>'滅絕師太','age'=>24], function($query){ $query->where('staff_id = 33'); });
2.類型轉(zhuǎn)換:默認(rèn)字段轉(zhuǎn)為string類型輸出,可以設(shè)置$type進行設(shè)置類型轉(zhuǎn)換如:
protected $type = [ 'staff_id' => 'integer', 'sex' => 'integer', 'age' => 'integer', 'salary'=> 'integer' ];
四.自動時間戳功能:可以當(dāng)進行新增和修改是自動將時間戳寫入指定的字段中
可以在database.php中進行修改 'auto_timestamp' => false, 這樣設(shè)置就是全局配置 不推薦這么修改
也可以在數(shù)據(jù)表對應(yīng)的模型文件中進行設(shè)置三個父類受保護的屬性 $autoWriteTimestamp 是否開啟自動時間戳 $createTime 創(chuàng)建文件的時間戳字段名 $updateTime 修改文件的時間戳字段名
//開啟當(dāng)前模型的自動時間戳功能 protected $autoWriteTimestamp = true; //設(shè)置一下用戶自定義的新增和更新時間的字段名 protected $createTime = 'create_time'; protected $updateTime = 'update_time';
五.驗證器: 就是創(chuàng)建一個驗證器類來進行驗證,驗證器類繼承于think\Validate.php 功能就是對指定數(shù)據(jù)進行數(shù)據(jù)驗證
1.創(chuàng)建一個驗證器類,繼承于think\Validate.php ,并寫入對應(yīng)要驗證的字段的驗證規(guī)則
2.自定義驗證錯誤信息,可以更友好的輸出錯誤信息
如下
namespace app\validate; use think\Validate; class Staff extends Validate { //驗證規(guī)則 protected $rule = [ 'name' => 'require|length:4,15', 'sex' => 'in:0,1', 'age' => 'require|between:18,60', 'salary'=>'require|gt:1500' ]; //自定義錯誤信息 protected $message = [ 'name.require' => '員工姓名不能為空', 'name.length' => '員工姓名長度不在范圍內(nèi)(4-15字符之間)', 'sex.in' => '性別必須是男或女', 'age.require' => '年齡不能為空', 'age.between' => '年齡必須在18-60之間', 'salary.require'=> '工資必須輸入', 'salary.gt' => '工資必須大于1500', ]; }
3.控制器文件:需要引入創(chuàng)建的驗證器類; 依賴注入驗證器類,調(diào)用驗證器類check("驗證的數(shù)據(jù)")方法 來進行驗證 驗證通過返回true 失敗返回false getError()方法返回對應(yīng)的錯誤信息
namespace app\index\controller; use think\Controller; use app\validate\Staff; //導(dǎo)入驗證器類 class Verify extends Controller { //驗證器 public function demo1(Staff $validate) //依賴注入 { //準(zhǔn)備一下要驗證的數(shù)據(jù) $data = [ 'name'=> '羅伯特唐尼', 'sex' => 1, 'age' => 22, 'salary' => 5000 ]; // $validate = new Staff(); if(!$validate->check($data)){ dump($validate->getError()); }else{ return '驗證通過'; } }
4.可以簡化驗證器 控制器調(diào)用父類Controller.php的方法validate($data,$rule,$message) $data:要驗證的數(shù)據(jù),$rule:驗證規(guī)則,$message:錯誤信息 $this->validate($data,$rule)錯誤返回錯誤信息 正確返回true
public function demo2() { $data = [ 'name'=> '鋼鐵俠羅伯特唐尼', 'sex' => 1, 'age' => 18, 'salary' => 5000 ]; //驗證規(guī)則 $rule = 'app\validate\Staff'; //驗證器類 $res = $this->validate($data,$rule); if($res !== true){ return $res; }else{ return '驗證成功!'; } }
5.當(dāng)想處理很簡單的驗證規(guī)則時可以直接寫入validate的參數(shù)中
$data = ['age'=>28]; $rule = ['age' => ['between:10,50','require']]; $message = ['age.between' => '年齡必須在10-50之間','age.require' => '年齡不能為空']; $res = $this->validate($data, $rule, $message); //直接傳入數(shù)據(jù),規(guī)則,錯誤信息 if($res !== true){ return $res; }else{ return '驗證成功!'; }
六.獨立驗證:就是不依賴自定義的驗證類,直接引入使用think\Validate.php中的方法進行驗證 Validate::make($rule,$message) 創(chuàng)建驗證規(guī)則并返回驗證對象, 驗證對象->check($data)即可進行驗證
use think\Validate;
public function demo3() { //1.創(chuàng)建驗證規(guī)則 $rule = ['age'=>'require|between:20,80']; //2.創(chuàng)建錯誤信息 $mess = [ 'age.require' => '年齡必須填寫', 'age.between' => '年齡必須在20-80之間', ]; //3.創(chuàng)建數(shù)據(jù) $data = ['age' => 50]; //Validate::make():創(chuàng)建驗證規(guī)則并返回驗證對象 $validate = Validate::make($rule,$mess); //4.進行驗證 $res = $validate->check($data); return $res ? '驗證成功' : $validate->getError(); }
Correcting teacher:韋小寶Correction time:2018-12-17 16:27:24
Teacher's summary:寫的很不錯哦!總結(jié)的也很完整!框架中的驗證可以幫助我們快速的完整項目!