1. 程式人生 > >thinkphp5.0 編輯界面驗證不合法後重定向到編輯界面時,給編輯界面重新分配數據

thinkphp5.0 編輯界面驗證不合法後重定向到編輯界面時,給編輯界面重新分配數據

規則 names 得到 還記得 輸入 分配 優先級 rule 獲取

首先,看一看 錯誤場景:

比如說我們有這樣一個編輯界面:
技術分享

而我們有這樣一些驗證方法(註:采用的是thinkphp5.0的驗證規則)

namespace app\admin\validate;
use think\Validate;
class Link extends Validate
{
    protected $rule = [
        "title" => "require|max:30",
        "priority" => "require|between:1,100",
        "url" => "url|require",
        
"des" => "length:1,255", ]; protected $message = [ "title.require" => "標題是必須的", "title.max" => "標題的最大長度為30", "priority.require" => "優先級是必須的", "priority.between" => "優先級必須在1~100之間", "url.url" => "鏈接地址不合法", "url.require" => "鏈接地址是必須的
", "des.between" => "描述必須在1~255個字符之間" ]; }

比如說我們驗證優先級,會要求我們輸入的優先級在1~100之間,但如果我們輸入的數大於100呢?會發生什麽?

技術分享

如下:

技術分享

驗證不通過!很好,到現在都沒有什麽問題,但是當等待的時間過去之後,會發生什麽?

技術分享

為什麽會發生這樣的事情呢?我們來看看edit控制器裏面的代碼。

public function edit(){
        if(request()->isPost()){//如果是表單提交
            $data = input("post.");//獲取到編輯界面的數據
            $validate 
= Loader::validate("Link");//加載驗證器類 if(!$validate->check($data)){//驗證數據是否和我們定義的驗證規則一致 $this -> error($validate->getError(),"edit","","2"); die; } $linkModel = new LinkModel();
$updateRes
= $linkModel -> updateLink(input("post."));//調用LinkModel裏面的方法更新數據 if($updateRes){ $this->success("修改成功","index","","1"); }else{ $this->error("修改失敗","edit","","1"); } return; } $res=db("link")->where("id",input("id"))->find();//通過最開始點擊編輯按鈕,然後去數據庫查找數據 if($res){ $this->assign("link",$res);//將數據分配給edit界面 }else{ $this->assign("link","");//如果找不到數據則分配給edit界面一個空(不然有可能會報錯) } return view();//加載界面 }

看以上代碼,到底是哪裏出現問題了呢?

我猜想是分配$res數據給界面出了問題。如果$res的數據為空的話,那麽我們分配給edit界面的數據就是一個空字符串。

來看看我們的edit界面是怎樣獲取數據的:

技術分享

註意,此刻我們的link是空字符串,那麽$link.id肯定是取不到值的,所以會報上面所說的那個錯?

可是為什麽$res會為空呢?如下:

不知道大家有沒有註意到這樣一句代碼:

$res=db("link")->where("id",input("id"))->find();//通過最開始點擊編輯按鈕,然後去數據庫查找數據

當我們驗證失敗時,重定向到edit界面,此刻我們通過點擊編輯按鈕傳過來的id已經被刷新了,此刻的id是沒有值得,所以自然就找不到。那怎麽解決呢?

我們驗證失敗,跳轉的代碼如下:

if(!$validate->check($data)){//驗證數據是否和我們定義的驗證規則一致
                $this -> error($validate->getError(),"edit","","2");
                die;
            }

在我們驗證失敗的時候:

 if(!$validate->check($data)){
                session("redirectId",$data[id]);
                $this -> error($validate->getError(),"edit","2");
                die;
            }

我們用session將id保存起來,然後在給edit分配數據的時候這樣寫:

  $redirectId = session("redirectId");//從session裏面將id取出來
        if($redirectId){//判斷session是不是為空
            $res=db("link")->where("id",$redirectId)->find();//用session裏面的id進行查找
        }
        else{
            $res=db("link")->where("id",input("id"))->find();//如果session為空,也就是我們的驗證沒有失敗,或者一開始點擊編輯按鈕進入編輯界面時的情景,用我們點擊編輯按鈕傳入進來的id進行查找
        }
        if($res){
           $this->assign("link",$res);//分配數據給模板
        }else{
            $this->assign("link","");
        }

這樣,無論怎樣從定向我們都能保證查詢得到值。但是還有一個問題,當你驗證失敗時,重定向到編輯界面之後,你不再對編輯界面操作,而是返回到列表頁。

技術分享

技術分享

此時因為你已經驗證失敗一次了,所以session裏面是有值的,當你點擊另外一條數據編輯的時候,還記得上面的代碼麽?我們首先是判斷你的session裏面是否有值,而此刻session裏面是存在一個id,那麽即使我們點擊不同的數據,編輯界面顯示的還是你的上一條數據。

蛋疼,怎麽解決?

其實很簡單,在你的列表頁的方法將session清空就可以了。如下:

 public function index(){
        session("redirectId",null);//刪除編輯的時候殘留的ID
        $res = db("link") ->order("priority","desc")-> paginate(2);
        if($res){
            $this->assign("linkList",$res);
        }else{
            $this->assign("linkList",array());
        }
        return view();
    }

好了,到現在一切都解決了。

thinkphp5.0 編輯界面驗證不合法後重定向到編輯界面時,給編輯界面重新分配數據