لارافيل Validation خصائص وشروط تسهل العمل، وقد لا تعرفها

لارافيل Validation خصائص وشروط تسهل العمل، وقد لا تعرفها

2024-05-14 وقت القراءه : 5 دقائق

جزء أساسي في أي مشروع أن يكون هناك تحقق من المدخلات، وأن يظهر رسالة واضحة للمستخدمين بطبيعة الخطأ إن حصل.

وبجانب عمليات التحقق Rule المتعارف عليها مثل required, min, max يوجد Rule أخرى قد لا تكون معروفة للبعض، في هذا المقال سوف نتطرق لأهم هذه الـ Rule ومحاولة توضيحها.

بداية لفرض أن لدينا هذا الفورم لتسجيل الطلاب

وعند إدخال البيانات نقوم بعملية التحقق التالية

public function store(Request $request){
    $request->validate([
        'name'=>'required|max:255',
        'email'=>'required|string|email|max:255|unique:users',
        'password'=>'required|string|confirmed|min:8',
        'tel'=>'required|string|max:255|unique:users',
    ]);
}

من خلال Rule التي تم وضعها بالأعلى فإنه أي حقل لا يتم تعبئة البيانات بداخلة سوف لن يقبله لأن جميعها required فسوف يتم إرجاع رسالة خطأ تفيد بأن الحقل مطلوب.

الأن لنتعرف على بعض الـ Rule الأخرى

Present / Filled

Present تعني أن الحقل يمكن أن يكون فارغا، لكن يجب أن يكون الحقل موجودا في بيانات الإدخال

'name'=>'present|max:255',

فلو تم حذف حقل name من html فإنه سوف يرجع خطأ

كما نلاحظ بالصوره أعلاه أن input name غير موجود في html ، لكن بما إنه present في validation فإنه إرجع رسالة field name must be present.


Filled

تعني أن input يجب أن يحتوي على بيانات، فهي شبيهه بـ required لكن برسالة مختلفة


Required

بالإضافة لعملية التحقق أن الـ input يجب أن يرسل بيانات، فإن required تأخذ بعض الـ parameters الأخرى مثل:

Required_with

'name'=>'required|max:255',
'email'=>'required_with:name|string|email|max:255|unique:users',

كما نلاحظ أننا في email إستخدمنا required_with:name وذلك يعني أن email هو حقل إجباري إذا كان name يحتوي على بيانات، أما إذا كان name فارغا فإن email ليس إجباريا

Required_if

'name'=>'max:255',
'email'=>'required_if:name,Ethar|string|email|max:255|unique:users',

تعني أن البريد الإلكتروني مطلوب إذا كان name='Ethar' ، أما إذا كان إسم أخر غير Ethar فإن الحقل email سيصبح إختياري.

أو مثلا ان الحقل مطلوب كانت قيمته تساوي jerusalem

'city_name'=>'required',
'city_code'=>'required_if:city_name,=,jerusalem',

numeric=>min/max

إذا كنا نتحقق من العمر وكتبنا هكذا في شرط التحقق

'age'=>'min:18',

فإنه لن يعطي نتائج صحيحة لأنه هنا تم التحقق من عدد characters وليس العمر ولتجنب ذلك يجب إستخدام numeric

'age'=>'numeric|min:18',


التحقق من أبعاد الصور Image Dimensions Validation

نستطيع التحقق من أبعاد الصور عند الرفع من خلال dimensions

'avatar'=>'dimenstions:min_width=100, min_height=200',
'avatar'=>'dimensions:ration=3/2',

رسالة الخطأ التي يتم إرجاعها 


 Date Validations التحقق من الوقت

لو أردنا التحقق أن التاريخ الذي تم إدخاله ليس في المستقبل (ليس غدا او بعد).

'birthh_date'=>'before:'.now()->toDateString(),

كما يوجد طريقة مختصرة لكتابة التحقق أن التاريخ المدخل ليس بعد اليوم

'birth_date'=>'before:today',

كذلك نستطيع إستخدام yesterday و tomorrow

'birth_date'=>'before:today',
'birth_date'=>'before:tomorrow',


كما نستطيع التحقق أن التاريخ المدخل بعد التاريخ المدخل من حقل أخر، مثلا لو لدي حقل بإسم start_date ونريد التحقق أن بيانات حقل تاريخ الميلاد يجب أن تكون بعد حقل start_date

'birth_date'=>'before:start_date',


Separators, Arrays, Custom Rules

نستطيع كتابة شروط التحقق كمصفوفة، حيث يجعلها ذلك أسهل بالقراءة

'name'=>['required','string','max:255'], 


String & regex

يعتبر regex مهمة جدا اذا كنا نرغب بتحديد نوع string، فإذا أردنا أن لا يحتوي الـ string على أرقام وأن يكون فقط أحرف لا بد من إستخدام regex

'name'=>'required|string|regex:/^[A-Za-z]+$/i',

كما أن إستخدام string يمنع إدخال أكواد إضافية وذلك للحماية من ثغرة XSS على سبيل المثال.

أما إذا أردنا أن يكون نوع string فقط أرقام، فإننا يجب ان نستخدم regex التالي

'tel'=>'required|string|regex:/^[0-9]+$/i',

كما يمكن إستخدام numeric

'tel'=>'required|numeric',

أما إذا أردنا إستخدام حروف وأرقام 

'name'=>'required|string|regex:/^[A-Za-z0-9]+$/i',


Numeric Vs Integer

integer هي قيمة رقمية لكن تقبل 0، حيث لو تم وضع صفر ببداية الرقم فإنه سوف يتم إزالته، على سبيل المثال لو تم إدخال الرقم 0599 فإنه لن يقبلها.

numeric تأخذ من 0 وما فوق. حيث يقبل ان يكون به صفر بالبداية.


array

تعني أن المدخلات يجب ان تكون على شكل مصفوفة

'name'=>'required | array',

كذلك نستطيع التحكم في نوع القيم القادمة من المصفوفة 

'name'=>'required | array',
'name.*'=>'integer'



كيف يمكن تغيير الرسائل الإفتراضية؟

يمكن لنا تخصيص الرسائل التي تظهر للمستخدمين، ووضع ما نريد وذلك من خلال إضافة مصفوفة أخرى للرسائل

public function store(Request $request){
    $request->validate([
        'name'=>[
            'required','string','max:255'
        ]
    ],[
        'name.required'=>'Name is Required Field, Please Add Name'
    ]);
}


public function store(Request $request){
    $request->validate([
        'name'=>'required|max:10',
        'email'=>'required|email|unique:users',
    ],[
        'name.required'=>'Please Add Name',
        'name.max'=>'Name Chars Must be less than 10',
        'email.required'=>'Please Add Email',
        'email.email'=>'Please Add Valid Email',
        'email.unique'=>'Email Already Exist, please Login or choose another email',
    ]);
}


نقل التحقق من Controller إلى Request File

من أجل كود أرتب وأسهل بالقراءة، يفضل نقل عملية التحقق إلى ملف منفصل، وللقيام بذلك

 php artisan make:request StoreUserRequest

يتم إنشاء كلاس منفصل بإسم StoreUserRequest في المسار app/http/requests/SoteUserReuest

بداخل الكلاس نجد دالتين الأولى authorize حيث يجب تحويل قيمة الإرجاع إلى true، والدالة الأخرى rules نكتب بداخلها validation rule

class StoreUserRequest extends FormRequest
{
    public function authorize(){
        return true;
    }

    public function rules()
    {
        return [
            'name'=>'required|max:10',
            'email'=>'required|email|unique:users',
        ];
    }
}

ولتخصيص رسائل الخطأ يجب إضافة دالة جديده بإسم  message

class StoreUserRequest extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules(){
        return [
            'name'=>'required|min:3|max:60',
            'message'=>'required|min:10',
        ];
    }

    public function messages(){
        return [
            'name.required'=>__('translation.requiredname'),
            'name.min:3'=>__('translation.namemin3'),
            'name.min:60'=>__('translation.namemin50'),
            'message.required'=>__('translation.requiredmsg'),
            'message.min:10'=>__('translation.messagemin10'),
        ];
    }
}

كما يمكن إضافة الترجمة للرسائل.

لكن إذا أردنا إستخدام ملف منفصل في عملية التحقق فيجب تغيير Request في دالة store,update... إلى إسم كلاس التحقق

public function store(StoreUserRequest $request){}

التعليقات
زائر
منذ 3 سنوات

جزاك الله خيراً

زائر
منذ 3 سنوات

مقالات رائعة بالتوفيق أخي

زائر
منذ 3 سنوات

ربنا يبارك فيك ويزيدك معلومات

كريم فخرى
منذ سنة

اولا مشكور ثانيا الregex للغة الانجليزية فقط حروف و ارقام هل فيه regex للحروف و الارقام العربية و الانجليزية بدون رموز

إضافة تعليق
Loading...