Validator (Doğrulayıcı)
composer'da kullanılabilen birçok doğrulayıcı bulunmaktadır, örneğin:
top-think/think-validate
respect/validation
Validator top-think/think-validate
Açıklama
ThinkPHP resmi doğrulayıcı
Proje Adresi
https://github.com/top-think/think-validate
Kurulum
composer require topthink/think-validate
Hızlı Başlangıç
Yeni bir app/index/validate/User.php
dosyası oluşturun
<?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' => 'Adı gereklidir',
'name.max' => 'Ad 25 karakterden uzun olmamalıdır',
'age.number' => 'Yaş sayı olmalıdır',
'age.between' => 'Yaş 1 ile 120 arasında olmalıdır',
'email' => 'E-posta formatı hatalıdır',
];
}
Kullanım
$data = [
'name' => 'thinkphp',
'email' => 'thinkphp@qq.com',
];
$validate = new \app\index\validate\User;
if (!$validate->check($data)) {
var_dump($validate->getError());
}
Validator workerman/validation
Açıklama
Proje, https://github.com/Respect/Validation'in Çince sürümüdür
Proje Adresi
https://github.com/walkor/validation
Kurulum
composer require workerman/validation
Hızlı Başlangıç
<?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('Takma Ad'),
'username' => v::alnum()->length(5, 64)->setName('Kullanıcı Adı'),
'password' => v::length(5, 64)->setName('Şifre')
]);
Db::table('user')->insert($data);
return json(['code' => 0, 'msg' => 'tamam']);
}
}
Jquery üzerinden erişme
$.ajax({
url : 'http://127.0.0.1:8787',
type : "post",
dataType:'json',
data : {nickname:'Tom', username:'tom cat', password: '123456'}
});
Sonuç alınır:
{"code":500,"msg":"Kullanıcı Adı sadece harf (a-z) ve rakam (0-9) içerebilir"}
Açıklama:
v::input(array $input, array $rules)
verileri doğrulamak ve toplamak için kullanılır, veri doğrulaması başarısız olursa Respect\Validation\Exceptions\ValidationException
istisnasını atar, doğrulama başarılıysa doğrulandıktan sonraki verileri (dizi) döndürür.
Eğer iş mantığı kodu doğrulama istisnasını yakalamamış ise, webman çerçevesi otomatik olarak yakalar ve HTTP istek başlığına göre json verileri (benzer şekilde {"code":500, "msg":"xxx"}
) veya normal bir istisnanın sayfasını döndürür. Döndürülen biçim iş gereksinimlerine uymuyorsa, geliştirici istisna (ValidationException
) yakalayabilir ve istenen veriyi döndürebilir, aşağıdaki örnekte olduğu gibi:
<?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('Kullanıcı Adı'),
'password' => v::length(5, 64)->setName('Şifre')
]);
} catch (ValidationException $e) {
return json(['code' => 500, 'msg' => $e->getMessage()]);
}
return json(['code' => 0, 'msg' => 'tamam', 'data' => $data]);
}
}
Validator Kılavuzu
use Respect\Validation\Validator as v;
// Tek bir kuralı doğrulama
$number = 123;
v::numericVal()->validate($number); // true
// Birden çok kuralı zincirleme doğrulama
$usernameValidator = v::alnum()->noWhitespace()->length(1, 15);
$usernameValidator->validate('alganet'); // true
// İlk başarısız doğrulama nedenini almak
try {
$usernameValidator->setName('Kullanıcı adı')->check('alg anet');
} catch (ValidationException $exception) {
echo $exception->getMessage(); // Kullanıcı adı sadece harfler (a-z) ve rakamlar (0-9) içerebilir
}
// Başarısız doğrulama nedenlerinin tümünü almak
try {
$usernameValidator->setName('Kullanıcı adı')->assert('alg anet');
} catch (ValidationException $exception) {
echo $exception->getFullMessage();
// Aşağıdakileri yazdıracak
// - Kullanıcı adı aşağıdaki kurallara uymalıdır
// - Kullanıcı adı sadece harfler (a-z) ve rakamlar (0-9) içerebilir
// - Kullanıcı adı boşluk içeremez
var_export($exception->getMessages());
// Aşağıdakileri yazdıracak
// array (
// 'alnum' => 'Kullanıcı adı sadece harfler (a-z) ve rakamlar (0-9) içerebilir',
// 'noWhitespace' => 'Kullanıcı adı boşluk içeremez',
// )
}
// Özel hata mesajları belirleme
try {
$usernameValidator->setName('Kullanıcı adı')->assert('alg anet');
} catch (ValidationException $exception) {
var_export($exception->getMessages([
'alnum' => 'Kullanıcı adı sadece harf ve rakam içerebilir',
'noWhitespace' => 'Kullanıcı adı boşluk içeremez',
'length' => 'length kuralına uygundur, bu yüzden görüntülenmeyecek'
]));
// Aşağıdakileri yazdıracak
// array(
// 'alnum' => 'Kullanıcı adı sadece harf ve rakam içerebilir',
// 'noWhitespace' => 'Kullanıcı adı boşluk içeremez'
// )
}
// Nesne doğrulama
$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
// Dizi doğrulama
$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() veya validate() kullanılabilir
// Opsiyonel doğrulama
v::alpha()->validate(''); // false
v::alpha()->validate(null); // false
v::optional(v::alpha())->validate(''); // true
v::optional(v::alpha())->validate(null); // true
// Ters kural
v::not(v::intVal())->validate(10); // false
Validator'ın validate()
check()
assert()
Üç Metodunun Farkları
validate()
boolean değer döndürür, istisna fırlatmaz
check()
doğrulama başarısız olduğunda istisna fırlatır, $exception->getMessage()
ile ilk başarısız doğrulama nedeni alınabilir
assert()
doğrulama başarısız olduğunda istisna fırlatır, $exception->getFullMessage()
ile tüm doğrulama nedenlerine ulaşabilirsiniz
Sık Kullanılan Doğrulama Kuralları Listesi
Alnum()
sadece harf ve rakam içerir
Alpha()
sadece harfler içerir
ArrayType()
dizi türü
Between(mixed $minimum, mixed $maximum)
girişin diğer iki değer arasında olup olmadığını doğrular.
BoolType()
mantıksal türü doğrular
Contains(mixed $expectedValue)
girişin belirli değerleri içerip içermediğini doğrular
ContainsAny(array $needles)
girişin en az bir tanımlı değeri içerip içermediğini doğrular
Digit()
girişin sadece rakamları içerip içermediğini doğrular
Domain()
geçerli bir etki alanı olup olmadığını doğrular
Email()
geçerli bir e-posta adresi olup olmadığını doğrular
Extension(string $extension)
uzantıyı doğrular
FloatType()
ondalık sayı türünü doğrular
IntType()
tam sayı olup olmadığını doğrular
Ip()
ip adresi olup olmadığını doğrular
Json()
json verisi olup olmadığını doğrular
Length(int $min, int $max)
uzunluğun verilen aralıkta olup olmadığını doğrular
LessThan(mixed $compareTo)
uzunluğun belirtilen değerden küçük olup olmadığını doğrular
Lowercase()
küçük harf olup olmadığını doğrular
MacAddress()
mac adresi olup olmadığını doğrular
NotEmpty()
boş olup olmadığını doğrular
NullType()
null olup olmadığını doğrular
Number()
sayı olup olmadığını doğrular
ObjectType()
nesne olup olmadığını doğrular
StringType()
dize türünü doğrular
Url()
url olup olmadığını doğrular
Daha fazla doğrulama kuralı için https://respect-validation.readthedocs.io/en/2.0/list-of-rules/ sayfasına bakınız.
Daha Fazla Bilgi
https://respect-validation.readthedocs.io/en/2.0/ adresini ziyaret edebilirsiniz.