thinkphp5.0 編輯界面驗證不合法後重定向到編輯界面時,給編輯界面重新分配數據
首先,看一看 錯誤場景:
比如說我們有這樣一個編輯界面:
而我們有這樣一些驗證方法(註:采用的是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 編輯界面驗證不合法後重定向到編輯界面時,給編輯界面重新分配數據