Kohana Validation 庫支援檔案上傳驗證,但官方範例多為單獨驗證 $_FILES。實務上常需同時驗證表單欄位與上傳檔案,本文示範合併驗證的最佳寫法。
$array->rule('file', 'Upload::type', array(array('jpg', 'png', 'gif')));
new Validation($_POST)、new Validation($_FILES) 需雙重判斷$post = new Validation(array_merge($_POST, $_FILES));
$post->rule('img', 'not_empty')
->rule('img', 'Upload::type', array(':value', array('jpg', 'png', 'gif')))
->rule('img', 'Upload::size', array(':value', '1M'));
Upload::type 簽名為 type($file, $allowed),故第一參數用 :value 接收檔案資訊陣列img 對應前端 <input type="file" name="img"> 的 name 屬性Upload::size 第二參數支援 1M、500K、1024 (bytes) 等格式Upload::valid(檢查上傳錯誤碼)、Upload::save(移動檔案)public function action_upload() {
$post = new Validation(array_merge($_POST, $_FILES));
$post->rule('title', 'not_empty')
->rule('title', 'max_length', array(':value', 100))
->rule('img', 'not_empty')
->rule('img', 'Upload::type', array(':value', array('jpg','png','gif')))
->rule('img', 'Upload::size', array(':value', '2M'));
if ($post->check()) {
$file = $_FILES['img'];
$filename = Upload::save($file, NULL, 'uploads/');
// 入庫、回應成功
} else {
$errors = $post->errors('validation'); // 統一錯誤訊息
// 回應失敗
}
}
Kohana 3.0/3.1 的 Upload::type 參數順序可能不同,升級時請查閱對應版本 API 文件。
合併驗證讓表單與檔案共用同一錯誤收集機制,代碼更乾淨,前端顯示更統一。建議將常用規則封裝為基類方法複用。