在開發一個用戶注冊系統時,我面臨著一個復雜的數據驗證問題。用戶可能會提交各種格式的數據,包括電子郵件、密碼、文件上傳等,這些數據需要通過一系列規則來驗證,以確保其有效性和安全性。然而,編寫這些驗證邏輯不僅耗時,而且容易出錯。經過一番研究,我發現了 rakit/validation 這個庫,它大大簡化了我的驗證工作。
Rakit/Validation 是一個獨立的 php 驗證庫,靈感來源于 laravel 的驗證系統。它提供了與 Laravel 類似的 API,使得在非 Laravel 項目中使用這些驗證功能變得非常方便。使用 composer 可以輕松安裝這個庫:
composer require rakit/validation
以下是使用 Rakit/Validation 進行數據驗證的一些示例:
基本使用
你可以使用 make 方法創建一個驗證對象,然后調用 validate 方法進行驗證,或者直接使用 validate 方法:
<?php require('vendor/autoload.php'); use RakitValidationValidator; $validator = new Validator; // 使用 `make` 方法 $validation = $validator->make($_POST + $_FILES, [ 'name' => 'required', 'email' => 'required|email', 'password' => 'required|min:6', 'confirm_password' => 'required|same:password', 'avatar' => 'required|uploaded_file:0,500K,png,jpeg', 'skills' => 'Array', 'skills.*.id' => 'required|numeric', 'skills.*.percentage' => 'required|numeric' ]); $validation->validate(); if ($validation->fails()) { // 處理錯誤 $errors = $validation->errors(); echo "<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">"; print_r($errors->firstOfAll()); echo "
“; exit; } else { // 驗證通過 echo “Success!”; } // 或者直接使用 `validate` 方法 $validation = $validator->validate($_POST + $_FILES, [ ‘name’ => ‘required’, ’email’ => ‘required|email’, ‘password’ => ‘required|min:6’, ‘confirm_password’ => ‘required|same:password’, ‘avatar’ => ‘required|uploaded_file:0,500K,png,jpeg’, ‘skills’ => ‘array’, ‘skills.*.id’ => ‘required|numeric’, ‘skills.*.percentage’ => ‘required|numeric’ ]); if ($validation->fails()) { // 處理錯誤 $errors = $validation->errors(); echo “
"; print_r($errors->firstOfAll()); echo "
“; exit; } else { // 驗證通過 echo “Success!”; }
自定義屬性別名和錯誤消息
Rakit/Validation 允許你自定義屬性別名和錯誤消息。例如,你可以使用 setAlias 或 setAliases 方法來設置屬性別名:
立即學習“PHP免費學習筆記(深入)”;
$validator = new Validator; $validation = $validator->make([ 'province_id' => $_POST['province_id'], 'district_id' => $_POST['district_id'] ], [ 'province_id' => 'required|numeric', 'district_id' => 'required|numeric' ]); $validation->setAlias('province_id', 'Province'); $validation->setAlias('district_id', 'District'); // 或者 $validation->setAliases([ 'province_id' => 'Province', 'district_id' => 'District' ]); $validation->validate();
你也可以自定義錯誤消息:
$validator = new Validator([ 'required' => ':attribute harus diisi', 'email' => ':email tidak valid', ]); // 或者使用 `setMessages` 方法 $validator->setMessages([ 'required' => ':attribute harus diisi', 'email' => ':email tidak valid', ]);
處理錯誤消息
Rakit/Validation 提供了一些方法來處理和獲取錯誤消息:
$validation = $validator->validate($inputs, $rules); $errors = $validation->errors(); $messages = $errors->all(); $messages = $errors->firstOfAll(); $message = $errors->first('email'); $messages = $errors->toArray(); $count = $errors->count(); $hasError = $errors->has('email');
獲取驗證數據
你可以使用以下方法獲取驗證后的數據:
$validatedData = $validation->getValidatedData(); $validData = $validation->getValidData(); $invalidData = $validation->getInvalidData();
自定義驗證規則
Rakit/Validation 允許你創建自定義驗證規則。例如,你可以創建一個 UniqueRule 類來檢查數據庫中的唯一性:
class UniqueRule extends Rule { protected $message = ":attribute :value has been used"; protected $fillableParams = ['table', 'column', 'except']; protected $pdo; public function __construct(PDO $pdo) { $this->pdo = $pdo; } public function check($value): bool { $this->requireParameters(['table', 'column']); $column = $this->parameter('column'); $table = $this->parameter('table'); $except = $this->parameter('except'); if ($except AND $except == $value) { return true; } $stmt = $this->pdo->prepare("select count(*) as count from `{$table}` where `{$column}` = :value"); $stmt->bindParam(':value', $value); $stmt->execute(); $data = $stmt->fetch(PDO::FETCH_ASSOC); return intval($data['count']) === 0; } } $validator = new Validator; $validator->addValidator('unique', new UniqueRule($pdo)); $validation = $validator->validate($_POST, [ 'email' => 'email|unique:users,email,exception@mail.com' ]);
使用 Rakit/Validation 庫,我能夠輕松地在我的項目中實現復雜的數據驗證。它不僅簡化了我的驗證邏輯,還提供了高度的靈活性和可定制性,使得我的用戶注冊系統更加健壯和安全。如果你也在尋找一個高效的 PHP 數據驗證解決方案,那么 Rakit/Validation 絕對值得一試。