Day23-從基礎學習 ThinkPHP-表單驗證(1)

前言

當我們送出一些表單的時候,都會有一些表單驗證的機制,那 ThinkPHP 呢?ThinkPHP 本身也有表單驗證功能,所以這一篇就會來介紹該如何使用 ThinkPHP 內建的表單驗證機制。

起手式

首先為了讓表單驗證可以看出所以然,所以這邊起頭要來建立一個新的資料表,專門存放帳號,SQL 語法就提供給各位:

1
2
3
4
5
6
7
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 本身就有提供表單驗證的功能,只需要引入該函式庫就可以了:

1
use think\Validate;

但是 ThinkPHP 在這邊的做法稍微有點不太一樣,它會需要建立一個資料夾放置驗證用的原始碼,所以就要這樣建立 user/validate/user.php

validate

那麼 user.php 這個檔案內容如下:

1
2
3
4
5
6
7
8
9
10
11
<?php

namespace app\user\validate;

use think\Validate;

class user extends Validate
{
protected $rule = [];
protected $message = [];
}

首先程式碼裡面有兩個變數 $rule$message$rule 代表的是要驗證的欄位以及規則,而 $message 則是顯示錯誤訊息,那麼我們有需要填入的欄位共三個,分別為 emailpasswordgender,另外 $rule 是採用陣列的方式,所以就可以這樣撰寫 $rule

1
2
3
4
5
protected $rule = [
'email' => 'require|email', // 驗證 Email 格式並且要必填
'password' => 'require|min:8|max:30', // 必填且最小長度 8 最大長度 30
'gender' => 'require|number',// 必填,只接受 number
];

多個驗證就用 | 分隔即可,如上述。

那麼提示訊息呢?當你驗證方式越多自然要會傳給使用者的訊息就會跟著越多,雖然系統有默認自定義提示訊息,但是還是建議自己寫提示訊息會比較好:

1
2
3
4
5
6
7
8
9
protected $message = [
'email.require' => 'Email 必填',
'email.email'=> 'Email 格式錯誤',
'password.require' => '密碼欄位必填',
'password.min' => '密碼最短長度為 8',
'password.max' => '密碼長度最長為 30',
'gender.require' => '性別必填',
'gender' => '性別必須為是數字'
];

這樣我們就將表單驗證給完成了。

控制器

接下來要來修改控制器,首先我們會將表單接收的方法寫到 add() 方法內,然後會回傳我們剛剛發送的資料:

1
2
3
public function add($email, $password, $gender) {
return $email. $password. $gender;
}

那麼該如何使用表單驗證呢?只需要加上一段 validate('資料','驗證器名稱') 即可搞定,這邊我順便接上資料庫,這樣才能夠看出真實性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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();
}
}

這時候當我直接不填任何直接送出,就可以直接看到驗證畫面 ↓

表單驗證

最後我相信你會覺得這樣寫很煩:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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() 只是方便我們呈現資料在畫面上的一個方法而已):

1
2
3
public function add() {
return json(input());
}

input 自動幫我們抓取表單欄位資料

所以我們就可以不用替函式設置變數,直接透過 input() 來取得表單欄位資料即可,但是這邊我們還可以更進一步的簡化儲存到資料庫的語法:

1
2
3
4
5
6
7
8
9
10
11
12
13
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 格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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();
}
}

批量驗證

結尾

這一章節先到這裡結束,已累。

但是基礎的表單驗證已經製作完成,那也因為寫太長所以拆成了兩個部分,接下來下一篇將會介紹將錯誤訊息回傳到前端畫面上。

0%