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

咱們更但願看到:

        // 新增對象至數據表
        $result = $Teacher->validate(true)->save();
而不是:

        // 新增對象至數據表
        $result = $Teacher->validate(true)->save($Teacher->getData());
緣由很簡單的,上面的寫法纔是真正的面象對象。正確的思想是:咱們給一個對象賦值,而後對這個對象進行驗證。顯然,上面的寫法更貼近咱們的真實想法。
ThinkPHP是一個開源的軟件,咱們能夠在Github中,找到它的身影 。下一個貢獻者會不會就是你呢?
在這裏,爲了更好的實現驗證,咱們對think\Model及think\Validate類進行改寫。

若是你並不想動框架的源代碼,那麼能夠略過下面本節中咱們下面要講的內容。只須要在之後涉及到驗證操做時,使用$Teacher->validate(true)->save($Teacher->getData());便可。
1、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)) {
...
2、  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();
測試:

相關文章
相關標籤/搜索