المدقق

يوجد العديد من المدققين في 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 طريقة Validate::rule() من think-validate

المدقق 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 الاستثناء تلقائيًا ويختار إرجاع بيانات JSON وفقًا لعنوان الطلب HTTP (مثل {"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' => 'يتوافق طول القاعدة، لذا لن يتم عرض هذه الرسالة'
    ]));
    // سيتم الطباعة 
    // array(
    //    'alnum' => 'اسم المستخدم يجب أن يحتوي فقط على حروف وأرقام',
    //    'noWhitespace' => 'اسم المستخدم لا يمكن أن يحتوي على مسافات'
    // )
}

// كائن التحقق
$user = new stdClass;
$user->name = 'ألكسندر';
$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

الفرق بين ثلاث طرق للمدقق validate() check() assert()

validate() يُرجع قيمة منطقية ولن يرمي استثناء

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/

محتوى إضافي

زيارة https://respect-validation.readthedocs.io/en/2.0/