標籤:maker [] blog key 寫法 return 需要 check cte
我們更希望看到: // 新增對象至資料表 $result = $Teacher->validate(true)->save();而不是: // 新增對象至資料表 $result = $Teacher->validate(true)->save($Teacher->getData());原因很簡單的,上面的寫法才是真正的面象對象。正確的思想是:我們給一個對象賦值,然後對這個對象進行驗證。顯然,上面的寫法更貼近我們的真實想法。ThinkPHP是一個開源的軟體,我們可以在Github中,找到它的身影 。下一個貢獻者會不會就是你呢?在這裡,為了更好的實現驗證,我們對think\Model及think\Validate類進行改寫。如果你並不想動架構的原始碼,那麼可以略過下面本節中我們下面要講的內容。只需要在以後涉及到驗證操作時,使用$Teacher->validate(true)->save($Teacher->getData());即可。一、think\Model類檔案的位於thinkphp/library/think/Model.php 1、我們找到其中的save方法,改寫前: public function save($data = [], $where = [], $sequence = null) { if (!empty($data)) { // 資料自動驗證 千鋒PHP-PHP培訓的實力派 if (!$this->validateData($data)) { return false; } // 資料對象賦值 foreach ($data as $key => $value) { $this->setAttr($key, $value, $data); } if (!empty($where)) { $this->isUpdate = true; } } // 檢測欄位 if (!empty($this->field)) { $this->db(); foreach ($this->data as $key => $val) { if (!in_array($key, $this->field)) { unset($this->data[$key]); } } }...改寫後: public function save($data = [], $where = [], $sequence = null) { if (!empty($data)) { // 資料自動驗證 if (!$this->validateData($data)) { return false; } // 資料對象賦值 foreach ($data as $key => $value) { $this->setAttr($key, $value, $data); } if (!empty($where)) { $this->isUpdate = true; } // 未傳入資料,則依新增與更新分別進行驗證 --- 夢雲智 } else { // 更新,只驗證有變化的值 if ($this->isUpdate && !empty($this->change)) { foreach ($this->change as $value) { $data[$value] = $this->getData($value); } // 新增,驗證全部的值 } else { $data = $this->getData(); } // 資料自動驗證 if (!$this->validateData($data, $this->isUpdate)) { return false; } } // 檢測欄位 if (!empty($this->field)) { $this->db(); foreach ($this->data as $key => $val) { if (!in_array($key, $this->field)) { unset($this->data[$key]); } } }...2、我們再找到該檔案中的validateData方法改寫前: /** * 自動驗證資料 * @access protected * @param array $data 驗證資料 * @return bool */ protected function validateData($data)... $validate = Loader::validate($name); if (!empty($scene)) { $validate->scene($scene); } } if (!$validate->check($data)) {...改寫後: /** * 自動驗證資料 * @access protected * @param array $data 驗證資料 * @param bool $isUpdate * @return bool */ protected function validateData($data, $isUpdate = false) ... $validate = Loader::validate($name); if (!empty($scene)) { $validate->scene($scene); } } // 進行資料更新操作則只驗證有變化的欄位 --- 夢雲智 if ($isUpdate) { $validate->reMakeRule($data); } if (!$validate->check($data)) {...二、 think\Validate類檔案的位於thinkphp/library/think/Validate.php 在類中新增reMakeRule方法,比如我在rule()方法後後面進行添加。 /** * 重建規則 (刪除規則中不存在的更新欄位規則 ) * @param array $datas 要驗證的資料 * @return */ public function reMakeRule($datas = []) { $rule = []; if (is_array($datas)) { foreach ($datas as $key => $data) { if (array_key_exists($key, $this->rule)) { $rule[$key] = $this->rule[$key]; } } } $this->rule = $rule; }有了上述代碼後,我們在C層就可以這樣使用了。 // 新增對象至資料表 $result = $Teacher->validate(true)->save();測試:
ThinkPHP5.0更改架構的驗證方法:對象->validate(true)->save();