جزء أساسي في أي مشروع أن يكون هناك تحقق من المدخلات، وأن يظهر رسالة واضحة للمستخدمين بطبيعة الخطأ إن حصل.
وبجانب عمليات التحقق 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 فسوف يتم إرجاع رسالة خطأ تفيد بأن الحقل مطلوب.
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', ]); }
من أجل كود أرتب وأسهل بالقراءة، يفضل نقل عملية التحقق إلى ملف منفصل، وللقيام بذلك
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){}
مقالات رائعة بالتوفيق أخي
ربنا يبارك فيك ويزيدك معلومات
اولا مشكور ثانيا الregex للغة الانجليزية فقط حروف و ارقام هل فيه regex للحروف و الارقام العربية و الانجليزية بدون رموز
زائر
جزاك الله خيراً