검증기
composer에는 사용할 수 있는 많은 검증기가 있습니다. 예를 들어:
top-think/think-validate
respect/validation
검증기 top-think/think-validate
설명
ThinkPHP 공식 검증기
프로젝트 주소
https://github.com/top-think/think-validate
설치
composer require topthink/think-validate
빠른 시작
새로 만들기 app/index/validate/User.php
<?php
namespace app\index\validate;
use think\Validate;
class User extends Validate
{
protected $rule = [
'name' => 'require|max:25',
'age' => 'number|between:1,120',
'email' => 'email',
];
protected $message = [
'name.require' => '이름은 필수입니다',
'name.max' => '이름은 25자 이내여야 합니다',
'age.number' => '나이는 숫자여야 합니다',
'age.between' => '나이는 1에서 120 사이여야 합니다',
'email' => '이메일 형식이 잘못되었습니다',
];
}
사용하기
$data = [
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com',
];
$validate = new \app\index\validate\User;
if (!$validate->check($data)) {
var_dump($validate->getError());
}
주의
webman에서는 think-validate의Validate::rule()
메서드를 지원하지 않습니다.
검증기 workerman/validation
설명
프로젝트는 https://github.com/Respect/Validation의 한글화 버전입니다.
프로젝트 주소
https://github.com/walkor/validation
설치
composer require workerman/validation
빠른 시작
<?php
namespace app\controller;
use support\Request;
use Respect\Validation\Validator as v;
use support\Db;
class IndexController
{
public function index(Request $request)
{
$data = v::input($request->post(), [
'nickname' => v::length(1, 64)->setName('닉네임'),
'username' => v::alnum()->length(5, 64)->setName('사용자 이름'),
'password' => v::length(5, 64)->setName('비밀번호')
]);
Db::table('user')->insert($data);
return json(['code' => 0, 'msg' => 'ok']);
}
}
jQuery로 접근하기
$.ajax({
url : 'http://127.0.0.1:8787',
type : "post",
dataType:'json',
data : {nickname:'톰', username:'tom cat', password: '123456'}
});
결과를 얻습니다:
{"code":500,"msg":"사용자 이름은 문자(a-z) 및 숫자(0-9)로만 구성되어야 합니다"}
설명:
v::input(array $input, array $rules)
는 데이터를 검증하고 수집하는 데 사용됩니다. 데이터 검증에 실패하면 Respect\Validation\Exceptions\ValidationException
예외가 발생되며, 검증에 성공하면 검증된 데이터(배열)가 반환됩니다.
비즈니스 코드가 검증 예외를 포착하지 않으면 webman 프레임워크가 자동으로 포착하고 HTTP 요청 헤더에 따라 json 데이터(유사하게 {"code":500, "msg":"xxx"}
) 또는 일반 예외 페이지를 반환합니다. 반환 형식이 비즈니스 요구와 일치하지 않을 경우, 개발자는 ValidationException
예외를 직접 포착하고 필요한 데이터를 반환할 수 있습니다. 아래 예와 유사하게:
<?php
namespace app\controller;
use support\Request;
use Respect\Validation\Validator as v;
use Respect\Validation\Exceptions\ValidationException;
class IndexController
{
public function index(Request $request)
{
try {
$data = v::input($request->post(), [
'username' => v::alnum()->length(5, 64)->setName('사용자 이름'),
'password' => v::length(5, 64)->setName('비밀번호')
]);
} catch (ValidationException $e) {
return json(['code' => 500, 'msg' => $e->getMessage()]);
}
return json(['code' => 0, 'msg' => 'ok', 'data' => $data]);
}
}
Validator 기능 안내
use Respect\Validation\Validator as v;
// 단일 규칙 검증
$number = 123;
v::numericVal()->validate($number); // true
// 여러 규칙 체인을 검증
$usernameValidator = v::alnum()->noWhitespace()->length(1, 15);
$usernameValidator->validate('alganet'); // true
// 첫 번째 검증 실패 사유 얻기
try {
$usernameValidator->setName('사용자 이름')->check('alg anet');
} catch (ValidationException $exception) {
echo $exception->getMessage(); // 사용자 이름은 문자(a-z) 및 숫자(0-9)로만 구성되어야 합니다
}
// 모든 검증 실패 사유 얻기
try {
$usernameValidator->setName('사용자 이름')->assert('alg anet');
} catch (ValidationException $exception) {
echo $exception->getFullMessage();
// 인쇄됨
// - 사용자 이름은 다음 규칙을 준수해야 합니다
// - 사용자 이름은 문자(a-z) 및 숫자(0-9)로만 구성되어야 합니다
// - 사용자 이름은 공백을 포함할 수 없습니다
var_export($exception->getMessages());
// 인쇄됨
// array (
// 'alnum' => '사용자 이름은 문자(a-z) 및 숫자(0-9)로만 구성되어야 합니다',
// 'noWhitespace' => '사용자 이름은 공백을 포함할 수 없습니다',
// )
}
// 커스텀 오류 메시지
try {
$usernameValidator->setName('사용자 이름')->assert('alg anet');
} catch (ValidationException $exception) {
var_export($exception->getMessages([
'alnum' => '사용자 이름은 문자와 숫자만 포함할 수 있습니다',
'noWhitespace' => '사용자 이름은 공백이 있어서 안됩니다',
'length' => 'length 규칙에 부합하므로 이 메시지는 표시되지 않습니다'
]));
// 인쇄됨
// array(
// 'alnum' => '사용자 이름은 문자와 숫자만 포함할 수 있습니다',
// 'noWhitespace' => '사용자 이름은 공백이 있어서 안됩니다'
// )
}
// 객체 검증
$user = new stdClass;
$user->name = 'Alexandre';
$user->birthdate = '1987-07-01';
$userValidator = v::attribute('name', v::stringType()->length(1, 32))
->attribute('birthdate', v::date()->minAge(18));
$userValidator->validate($user); // true
// 배열 검증
$data = [
'parentKey' => [
'field1' => 'value1',
'field2' => 'value2',
'field3' => true,
]
];
v::key(
'parentKey',
v::key('field1', v::stringType())
->key('field2', v::stringType())
->key('field3', v::boolType())
)
->assert($data); // check() 또는 validate()를 사용할 수도 있습니다.
// 선택적 검증
v::alpha()->validate(''); // false
v::alpha()->validate(null); // false
v::optional(v::alpha())->validate(''); // true
v::optional(v::alpha())->validate(null); // true
// 부정 규칙
v::not(v::intVal())->validate(10); // false
Validator의 세 가지 메서드 validate()
check()
assert()
의 차이
validate()
는 boolean 값을 반환하며 예외를 발생시키지 않습니다.
check()
는 검증에 실패하면 예외를 발생시키며, 첫 번째 검증 실패의 이유는 $exception->getMessage()
로 확인할 수 있습니다.
assert()
는 검증에 실패하면 예외를 발생시키며, 모든 검증 실패 사유는 $exception->getFullMessage()
로 확인할 수 있습니다.
일반적인 검증 규칙 목록
Alnum()
문자와 숫자만 포함
Alpha()
문자만 포함
ArrayType()
배열 유형
Between(mixed $minimum, mixed $maximum)
입력이 다른 두 값 사이에 있는지 검증합니다.
BoolType()
부울형인지 검증합니다.
Contains(mixed $expectedValue)
입력이 특정 값을 포함하는지 검증합니다.
ContainsAny(array $needles)
입력이 정의된 값 중 최소한 하나 이상 포함하는지 검증합니다.
Digit()
입력이 숫자만 포함하는지 검증합니다.
Domain()
유효한 도메인인지 검증합니다.
Email()
유효한 이메일 주소인지 검증합니다.
Extension(string $extension)
파일 확장자를 검증합니다.
FloatType()
부동 소수점 형식인지 검증합니다.
IntType()
정수형인지 검증합니다.
Ip()
IP 주소인지 검증합니다.
Json()
JSON 데이터인지 검증합니다.
Length(int $min, int $max)
길이가 주어진 범위 내에 있는지 검증합니다.
LessThan(mixed $compareTo)
길이가 주어진 값보다 작은지 검증합니다.
Lowercase()
소문자여야 하는지 검증합니다.
MacAddress()
MAC 주소인지 검증합니다.
NotEmpty()
비어 있지 않은지 검증합니다.
NullType()
null인지 검증합니다.
Number()
숫자인지 검증합니다.
ObjectType()
객체인지 검증합니다.
StringType()
문자열 유형인지 검증합니다.
Url()
URL인지 검증합니다.
자세한 검증 규칙은 https://respect-validation.readthedocs.io/en/2.0/list-of-rules/ 에서 확인할 수 있습니다.