當我們送出一些表單的時候,都會有一些表單驗證的機制,那 ThinkPHP 呢?ThinkPHP 本身也有表單驗證功能,所以這一篇就會來介紹該如何使用 ThinkPHP 內建的表單驗證機制。
首先為了讓表單驗證可以看出所以然,所以這邊起頭要來建立一個新的資料表,專門存放帳號,SQL 語法就提供給各位:
CREATE TABLE think_account (
id int(10) NOT NULL auto_increment,
email varchar(15) NOT NULL default '',
password varchar(10) NOT NULL default 0,
gender int(2) NOT NULL default 0,
PRIMARY KEY (id)
) AUTO_INCREMENT=1;
然後接下來建立 user 資料夾,並於 view 底下建立兩個頁面,分別為註冊頁面 (signup.html) 與登入頁面 (signin.html),內容我就不再額外提供 ↓
那麼畫面就會像這樣子 ↓
路由與控制器部分我也不再額外提供,因為這部分撰寫很多次了。
首先 ThinkPHP 本身就有提供表單驗證的功能,只需要引入該函式庫就可以了:
use think\Validate;
但是 ThinkPHP 在這邊的做法稍微有點不太一樣,它會需要建立一個資料夾放置驗證用的原始碼,所以就要這樣建立 user/validate/user.php
↓
那麼 user.php
這個檔案內容如下:
<?php
namespace app\user\validate;
use think\Validate;
class user extends Validate
{
protected $rule = [];
protected $message = [];
}
首先程式碼裡面有兩個變數 $rule
、$message
,$rule
代表的是要驗證的欄位以及規則,而 $message
則是顯示錯誤訊息,那麼我們有需要填入的欄位共三個,分別為 email
、password
、gender
,另外 $rule
是採用陣列的方式,所以就可以這樣撰寫 $rule
:
protected $rule = [
'email' => 'require|email', // 驗證 Email 格式並且要必填
'password' => 'require|min:8|max:30', // 必填且最小長度 8 最大長度 30
'gender' => 'require|number',// 必填,只接受 number
];
多個驗證就用 |
分隔即可,如上述。
那麼提示訊息呢?當你驗證方式越多自然要會傳給使用者的訊息就會跟著越多,雖然系統有默認自定義提示訊息,但是還是建議自己寫提示訊息會比較好:
protected $message = [
'email.require' => 'Email 必填',
'email.email'=> 'Email 格式錯誤',
'password.require' => '密碼欄位必填',
'password.min' => '密碼最短長度為 8',
'password.max' => '密碼長度最長為 30',
'gender.require' => '性別必填',
'gender' => '性別必須為是數字'
];
這樣我們就將表單驗證給完成了。
接下來要來修改控制器,首先我們會將表單接收的方法寫到 add()
方法內,然後會回傳我們剛剛發送的資料:
public function add($email, $password, $gender) {
return $email. $password. $gender;
}
那麼該如何使用表單驗證呢?只需要加上一段 validate('資料','驗證器名稱')
即可搞定,這邊我順便接上資料庫,這樣才能夠看出真實性:
public function add($email, $password, $gender) {
$user = new userModel;
$user->email = $email;
$user->password = $password;
$user->gender = $gender;
$result = $this->validate($user,'User');
if($result){
return $result;
}
if($user->save()){
return '新增成功';
} else {
return $user->getError();
}
}
這時候當我直接不填任何直接送出,就可以直接看到驗證畫面 ↓
最後我相信你會覺得這樣寫很煩:
public function add($email, $password, $gender) {
$user = new userModel;
$user->email = $email;
$user->password = $password;
$user->gender = $gender;
$result = $this->validate($user,'User');
if($result) {
return $result;
}
if($user->save()){
return '新增成功';
} else {
return $user->getError();
}
}
所以我們可以將這一段程式碼給簡化,可以不用再函示上面設置變數接收表單資料,只需要使用 input()
,先讓我們把程式碼修改一下變成這樣,然後來看這樣是否成功(json()
只是方便我們呈現資料在畫面上的一個方法而已):
public function add() {
return json(input());
}
所以我們就可以不用替函式設置變數,直接透過 input()
來取得表單欄位資料即可,但是這邊我們還可以更進一步的簡化儲存到資料庫的語法:
public function add() {
$user = new userModel;
$userData = input();
$result = $this->validate($userData, 'User');
if($result) {
return $result;
}
if($user->save($userData)){
return '新增成功';
} else {
return $user->getError();
}
}
另外 ThinkPHP 還有提供一個功能,也就是批量驗證,預設只要遇到一個表單欄位沒有符合驗證規則就會直接跳掉,然後你就不知道其他欄位到底是否正確,那麼只需要在程式最前面加入一行 protected $batchValidate = true;
即可搞定,但是要注意此時的 $result
將會輸出陣列,若直接輸出將會出現錯誤,所以請記得要轉成 JSON 格式:
protected $batchValidate = true;
public function add() {
$user = new userModel;
$userData = input();
$result = $this->validate($userData, 'User');
if($result) {
return json($result);
}
if($user->save($userData)){
return '新增成功';
} else {
return $user->getError();
}
}
這一章節先到這裡結束,已累。
但是基礎的表單驗證已經製作完成,那也因為寫太長所以拆成了兩個部分,接下來下一篇將會介紹將錯誤訊息回傳到前端畫面上。
本文同步發表於:https://hsiangfeng.github.io/php/20190924/3094489394/