ThinkPHP5.0更改架構的驗證方法:對象->validate(true)->save();

來源:互聯網
上載者:User

標籤: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();

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.