الفرق بين المراجعتين لصفحة: «Laravel/validation»
تسنيم-ولهازي (نقاش | مساهمات) أنشأ الصفحة ب' == التحقق (validation) == == مقدّمة == يوفّر Laravel عدّة طرق مختلفة للتحقّق من صحّة البيانات الواردة للت...' |
جميل-بيلوني (نقاش | مساهمات) ط ←== |
||
(11 مراجعة متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة) | |||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:التحقق (validation) في Laravel}}</noinclude>يوفّر [[Laravel]] عدّة طرق مختلفة للتحقّق من صحّة البيانات الواردة للتطبيقك. يستخدم صنف وحدة التحكّم الأساسي في [[Laravel]] الخاصيّة <code>ValidatesRequests</code> التي توفّر طريقة ملائمة للتحقق من صحة الطلب HTTP الوارد بمجموعة متنوّعة من قواعد التحقق الفعّالة. | |||
==بداية سريعة في التحقّق== | |||
لمعرفة المزيد عن ميزات التحقق الفعالة في [[Laravel]]، دعنا نلقي نظرة على مثال كامل من التحقق من صحّة استمارة وعرض رسائل الخطأ على المستخدم. | |||
===تعريف المسارات=== | |||
يوفّر Laravel عدّة طرق مختلفة للتحقّق من صحّة البيانات الواردة للتطبيقك. يستخدم صنف وحدة التحكّم الأساسي في Laravel الخاصيّة ValidatesRequests التي توفّر طريقة ملائمة للتحقق من صحة الطلب HTTP الوارد بمجموعة متنوّعة من قواعد التحقق الفعّالة. | لنفترض أولًا أنّ لدينا المسارات التالية المحدّدة في ملفّنا <code>routes/web.php</code>:<syntaxhighlight lang="php"> | ||
== بداية سريعة في التحقّق == | |||
لمعرفة المزيد عن ميزات التحقق الفعالة في Laravel ، دعنا نلقي نظرة على مثال كامل من التحقق من صحّة استمارة وعرض رسائل الخطأ على المستخدم. | |||
=== تعريف المسارات === | |||
لنفترض أولًا أنّ لدينا المسارات التالية المحدّدة في ملفّنا routes/web.php:<syntaxhighlight lang="php"> | |||
Route::get('post/create', 'PostController@create'); | Route::get('post/create', 'PostController@create'); | ||
سطر 16: | سطر 10: | ||
</syntaxhighlight>سيعرض المسار GET استمارة للمستخدم لإنشاء منشور مدوّنة جديد بينما سيخزّن المسار POST منشور المدونة الجديد في قاعدة البيانات. | </syntaxhighlight>سيعرض المسار GET استمارة للمستخدم لإنشاء منشور مدوّنة جديد بينما سيخزّن المسار POST منشور المدونة الجديد في قاعدة البيانات. | ||
===إنشاء وحدة التحكّم=== | |||
=== إنشاء وحدة التحكّم === | فلنلقي في الخطوة التالية نظرة على وحدة تحكم بسيطة تتعامل مع هذه المسارات. سنترك التابع <code>store</code> فارغًا حاليًّا:<syntaxhighlight lang="php"> | ||
فلنلقي في الخطوة التالية نظرة على وحدة تحكم بسيطة تتعامل مع هذه المسارات. سنترك التابع store فارغًا حاليًّا:<syntaxhighlight lang="php"> | |||
<?php | <?php | ||
سطر 51: | سطر 44: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===كتابة منطق التحقّق=== | |||
نحن الآن مُستعدّون لملء التابع <code>store</code> بالمنطق للتحقق من مشاركة المدوّنة الجديدة. لذلك، سنستخدم التابع <code>validate</code> المقدّم من الكائن <code>Illuminate\Http\Request</code>. إذا نجحت قواعد التحقّق، ستواصل التعليمات البرمجيّة التنفيذ بشكل طبيعي؛ ولكن في حالة فشل التحقق من الصحّة، سيُطرح استثناء وتُرسل استجابة الخطأ المناسبة إلى المستخدم تلقائيًا. ستُنشئ في حالة طلب HTTP تقليدي استجابة إعادة توجيه، في حين تُرسل استجابة JSON لطلبات AJAX. | |||
لفهم التابع <code>validate</code> بشكل أفضل، فلنعد مرّة أخرى إلى التابع <code>store</code>:<syntaxhighlight lang="php"> | |||
لفهم التابع validate بشكل أفضل، فلنعد مرّة أخرى إلى التابع store :<syntaxhighlight lang="php"> | |||
/** | /** | ||
سطر 75: | سطر 68: | ||
</syntaxhighlight>كما ترى نُمرّر قواعد التحقق المرغوبة للتابع validate. ومرّة أخرى، إذا فشل التحقّق من الصحّة، ستُنشئ الاستجابة المناسبة تلقائيًا. إن نجحت عمليّة التحقّق، ستستمر وحدة تحكّمنا في العمل بشكل طبيعي. | </syntaxhighlight>كما ترى نُمرّر قواعد التحقق المرغوبة للتابع <code>validate</code>. ومرّة أخرى، إذا فشل التحقّق من الصحّة، ستُنشئ الاستجابة المناسبة تلقائيًا. إن نجحت عمليّة التحقّق، ستستمر وحدة تحكّمنا في العمل بشكل طبيعي. | ||
====التوقف عند أوّل فشل تحقّق==== | |||
==== التوقف عند أوّل فشل تحقّق ==== | |||
قد ترغب أحيانًا في إيقاف تشغيل قواعد التحقق من صحّة خاصيّة (attribute) ما بعد أول فشل في التحقّق. للقيام بذلك، عيّن القاعدة bail على السمة:<syntaxhighlight lang="php"> | قد ترغب أحيانًا في إيقاف تشغيل قواعد التحقق من صحّة خاصيّة (attribute) ما بعد أول فشل في التحقّق. للقيام بذلك، عيّن القاعدة bail على السمة:<syntaxhighlight lang="php"> | ||
$request->validate([ | $request->validate([ | ||
سطر 83: | سطر 75: | ||
'body' => 'required', | 'body' => 'required', | ||
]); | ]); | ||
</syntaxhighlight>في هذا المثال، إذا فشلت القاعدة unique مع الخاصيّة | </syntaxhighlight>في هذا المثال، إذا فشلت القاعدة unique مع الخاصيّة <code>title</code>، لن يتحقّق من القاعدة max. سيتم التحقق من القواعد بالترتيب الذي عُيّنت عليه. | ||
====ملاحظة حول الخاصيات المتداخلة==== | |||
==== ملاحظة حول الخاصيات المتداخلة ==== | |||
تستطيع تحديد معاملاتك 'المتداخلة"، إن احتوى طلبك HTTP عليها، في قواعد تحقّقك باستخدام الصيغة "نقطة":<syntaxhighlight lang="php"> | تستطيع تحديد معاملاتك 'المتداخلة"، إن احتوى طلبك HTTP عليها، في قواعد تحقّقك باستخدام الصيغة "نقطة":<syntaxhighlight lang="php"> | ||
$request->validate([ | $request->validate([ | ||
سطر 93: | سطر 84: | ||
]); | ]); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==عرض أخطاء التحقق== | |||
لكن ماذا لو لم تتجاوز معاملات الطلب الوارد قواعد التحقق المحددة؟ كما ذكرنا سابقًا، سيُعيد [[Laravel]] توجيه المستخدم تلقائيًا إلى موقعه السابق. بالإضافة إلى ذلك، ستومض جميع أخطاء التحقق تلقائيًا إلى الجلسة. | |||
مرة أخرى، لاحظ أننا لم نضطر لربط رسائل الخطأ صراحة بالواجهة في مسارنا <code>GET</code>. ويرجع ذلك لتحقّق [[Laravel]] من وجود أخطاء في بيانات الجلسات وربطها تلقائيًا بالواجهة إذا كانت متوفرة. سيكون المتغيّر <code>$errors</code> نسخة من <code>Illuminate\Support\MessageBag</code>. لمزيد من المعلومات حول العمل مع هذا الكائن راجع توثيقه. | |||
مرة أخرى، لاحظ أننا لم نضطر لربط رسائل الخطأ صراحة بالواجهة في مسارنا <code>GET</code>. ويرجع ذلك لتحقّق Laravel من وجود أخطاء في بيانات الجلسات وربطها تلقائيًا بالواجهة إذا كانت متوفرة. سيكون المتغيّر <code>$errors</code> نسخة من <code>Illuminate\Support\MessageBag</code>. لمزيد من المعلومات حول العمل مع هذا الكائن راجع توثيقه. | |||
ملاحظة: يرتبط المتغيّر <code>errors$</code> بالواجهة عبر البرمجيّة الوسيطة <code>Illuminate\View\Middleware\ShareErrorsFromSession</code> التي تُوفّرها مجموعة برمجيّات <code>web</code> الوسيطة. عند تطبيق هذه البرمجيّة الوسيطة، سيصبح المتغيّر <code>$errors</code> متاحًا دائمًا في واجهاتك مما يتيح لك افتراض أن المتغيّر <code>$errors</code> مُعرّف دائمًا ويمكن استخدامه بأمان. | ملاحظة: يرتبط المتغيّر <code>errors$</code> بالواجهة عبر البرمجيّة الوسيطة <code>Illuminate\View\Middleware\ShareErrorsFromSession</code> التي تُوفّرها مجموعة برمجيّات <code>web</code> الوسيطة. عند تطبيق هذه البرمجيّة الوسيطة، سيصبح المتغيّر <code>$errors</code> متاحًا دائمًا في واجهاتك مما يتيح لك افتراض أن المتغيّر <code>$errors</code> مُعرّف دائمًا ويمكن استخدامه بأمان. | ||
سطر 119: | سطر 109: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===ملاحظة حول الحقول الاختيارية=== | |||
=== ملاحظة حول الحقول الاختيارية === | يحتوي [[Laravel]] افتراضيًّا على البرمجيّتين الوسيطتين <code>TrimStrings</code> و <code>ConvertEmptyStringsToNull</code> في مكدّس برمجيّات تطبيقك الوسيطة العامة. تورد قائمة هذه البرمجيّات الوسيطة في المكدس من طرف الصنف <code>App\Http\Kernel</code>. وبسبب هذا، ستحتاج غالبًا لوضع علامة على حقول طلبك "الاختيارية" كقيمة <code>nullable</code> إن لم تُرد أن يعتبر المحقّق القيم <code>null</code> غير صالحة. على سبيل المثال:<syntaxhighlight lang="php"> | ||
يحتوي Laravel افتراضيًّا على البرمجيّتين الوسيطتين <code>TrimStrings</code> و <code>ConvertEmptyStringsToNull</code> في مكدّس برمجيّات تطبيقك الوسيطة العامة. تورد قائمة هذه البرمجيّات الوسيطة في المكدس من طرف الصنف <code>App\Http\Kernel</code>. وبسبب هذا، ستحتاج غالبًا لوضع علامة على حقول طلبك "الاختيارية" كقيمة <code>nullable</code> إن لم تُرد أن يعتبر المحقّق القيم <code>null</code> غير صالحة. على سبيل المثال:<syntaxhighlight lang="php"> | |||
$request->validate([ | $request->validate([ | ||
'title' => 'required|unique:posts|max:255', | 'title' => 'required|unique:posts|max:255', | ||
سطر 128: | سطر 117: | ||
]); | ]); | ||
</syntaxhighlight>نُحدّد في هذا المثال أن الحقل <code>publish_at</code> يكون إما ذو قيمة <code>null</code> أو تاريخ صالح. إن لم يُضف المُحدّد <code>nullable</code> لتعريف القاعدة، سيعتبر المُدقّق القيمة <code>null</code> غير صالحة. | </syntaxhighlight>نُحدّد في هذا المثال أن الحقل <code>publish_at</code> يكون إما ذو قيمة <code>null</code> أو تاريخ صالح. إن لم يُضف المُحدّد <code>nullable</code> لتعريف القاعدة، سيعتبر المُدقّق القيمة <code>null</code> غير صالحة. | ||
===طلبات وتحقّق [[AJAX]]=== | |||
=== طلبات وتحقّق AJAX === | في هذا المثال استخدمنا نموذجًا تقليديًا لإرسال البيانات إلى التطبيق. ولكن العديد من التطبيقات تستخدم طلبات [[AJAX]]. عند استخدام التابع <code>validate</code> أثناء طلب AJAX ، لن يُولّد [[Laravel]] استجابة إعادة توجيه. بدلاً من ذلك، يُولّد [[Laravel]] استجابة [[JSON]] تحتوي على جميع أخطاء التحقق من الصحة. ستُرسل هذه الاستجابة [[JSON]] برمز حالة HTTP 422. | ||
في هذا المثال استخدمنا نموذجًا تقليديًا لإرسال البيانات إلى التطبيق. ولكن العديد من التطبيقات تستخدم طلبات AJAX. عند استخدام التابع <code>validate</code> أثناء طلب AJAX ، لن يُولّد Laravel استجابة إعادة توجيه. بدلاً من ذلك، يُولّد Laravel استجابة JSON تحتوي على جميع أخطاء التحقق من الصحة. ستُرسل هذه الاستجابة JSON برمز حالة HTTP 422. | ==التحقّق من صحّة طلب استمارة== | ||
===إنشاء طلبات الاستمارة=== | |||
== التحقّق من صحّة طلب استمارة == | |||
=== إنشاء طلبات الاستمارة === | |||
قد ترغب في إنشاء "طلب استمارة" من أجل سيناريوهات التحقق الأكثر تعقيدًا. طلبات الاستمارات هي أصناف طلبات مخصّصة تحتوي على منطق التحقق من الصحة. لإنشاء صنف طلب استمارة، استخدم الأمر <code>make:request</code> Artisan CLI:<syntaxhighlight lang="php"> | قد ترغب في إنشاء "طلب استمارة" من أجل سيناريوهات التحقق الأكثر تعقيدًا. طلبات الاستمارات هي أصناف طلبات مخصّصة تحتوي على منطق التحقق من الصحة. لإنشاء صنف طلب استمارة، استخدم الأمر <code>make:request</code> Artisan CLI:<syntaxhighlight lang="php"> | ||
سطر 153: | سطر 139: | ||
} | } | ||
</syntaxhighlight>ملاحظة: تستطيع كتابة أي تلميح على النوع تحتاج إليه ضمن توقيع التابع <code>rules</code>. سيُستبان تلقائيًا عبر | </syntaxhighlight>ملاحظة: تستطيع كتابة أي تلميح على النوع تحتاج إليه ضمن توقيع التابع <code>rules</code>. سيُستبان تلقائيًا عبر ح<nowiki/>[[Laravel/container|اوي خدمات Laravel]]. | ||
كيف إذن تُقيّم قواعد التحّقق؟ كل ما عليك فعله هو التلميح على نوع الطلب في تابع وحدة تحكّمك. يُتحقّق من صحّة طلب | كيف إذن تُقيّم قواعد التحّقق؟ كل ما عليك فعله هو التلميح على نوع الطلب في تابع وحدة تحكّمك. يُتحقّق من صحّة طلب الاستمارة الوارد قبل مناداة تابع وحدة التحكّم ممّا يعني أنه لا حاجة لكركبة وحدة تحكّمك بأي منطق للتحقّق من الصحة:<syntaxhighlight lang="php"> | ||
/** | /** | ||
سطر 174: | سطر 160: | ||
</syntaxhighlight>في حالة فشل التحقّق من الصحّة، ستُولّد استجابة إعادة توجيه لإعادة إرسال المستخدم لموقعه السابق. كما ستُموّض (flash) الأخطاء للجلسة كي تكون متاحة للعرض. إن كان الطلب طلب AJAX، ستُردّ استجابة HTTP برمز الحالة 422 للمستخدم بما في ذلك تمثيل JSON لأخطاء التحقق من الصحة. | </syntaxhighlight>في حالة فشل التحقّق من الصحّة، ستُولّد استجابة إعادة توجيه لإعادة إرسال المستخدم لموقعه السابق. كما ستُموّض (flash) الأخطاء للجلسة كي تكون متاحة للعرض. إن كان الطلب طلب AJAX، ستُردّ استجابة HTTP برمز الحالة 422 للمستخدم بما في ذلك تمثيل JSON لأخطاء التحقق من الصحة. | ||
====إضافة خطافات لاحقة إلى طلبات النموذج (Adding After Hooks To Form Requests)==== | |||
==== إضافة خطافات لاحقة إلى طلبات النموذج (Adding After Hooks To Form Requests) ==== | |||
إن رغبت في إضافة خطاف "لاحق" إلى طلب نموذج، تستطيع استخدام التابع <code>withValidator</code>. يستقبل هذا التابع أداة التحقق المبنية بالكامل ممّا يسمح لك بمناداة أي من توابعها قبل تقييم قواعد التحقق من الصحة:<syntaxhighlight lang="php"> | إن رغبت في إضافة خطاف "لاحق" إلى طلب نموذج، تستطيع استخدام التابع <code>withValidator</code>. يستقبل هذا التابع أداة التحقق المبنية بالكامل ممّا يسمح لك بمناداة أي من توابعها قبل تقييم قواعد التحقق من الصحة:<syntaxhighlight lang="php"> | ||
سطر 194: | سطر 179: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===تخويل طلبات الاستمارة (Authorizing Form Requests)=== | |||
=== تخويل طلبات الاستمارة (Authorizing Form Requests) === | يحتوي صنف طلب الاستمارة أيضًا على التابع <code>authorize</code>. تستطيع التحقق ضمن هذا التابع ما إذا امتلك المستخدم المصادق عليه فعلًا سلطة تحديث مورد معيّن. يمكنك على سبيل المثال، تحديد ما إذا كان المستخدم يملك بالفعل تعليق مدوّنة يحاول تحديثه:<syntaxhighlight lang="php"> | ||
يحتوي صنف طلب الاستمارة أيضًا على | |||
/** | /** | ||
* حدد ما إذا كان المستخدم مخولًا لعمل هذا الطلب. | * حدد ما إذا كان المستخدم مخولًا لعمل هذا الطلب. | ||
سطر 209: | سطر 193: | ||
} | } | ||
</syntaxhighlight>نظرًا لأن جميع طلبات الاستمارات تُوسّع صنف طلب Laravel الأساسي، نستطيع استخدام التابع <code>user</code> للوصول إلى المستخدم المصادق عليه حاليًا. لاحظ أيضًا مناداة التابع <code>route</code> في المثال أعلاه. يمنحك هذا التابع إمكانيّة الوصول إلى معاملات URI المحدّدة في المسار المُنادى، مثل المعامل {comment} في المثال التالي:<syntaxhighlight lang="php"> | </syntaxhighlight>نظرًا لأن جميع طلبات الاستمارات تُوسّع صنف طلب [[Laravel]] الأساسي، نستطيع استخدام التابع <code>user</code> للوصول إلى المستخدم المصادق عليه حاليًا. لاحظ أيضًا مناداة التابع <code>route</code> في المثال أعلاه. يمنحك هذا التابع إمكانيّة الوصول إلى معاملات URI المحدّدة في المسار المُنادى، مثل المعامل <code>{comment}</code> في المثال التالي:<syntaxhighlight lang="php"> | ||
Route::post('comment/{comment}'); | Route::post('comment/{comment}'); | ||
سطر 227: | سطر 211: | ||
} | } | ||
</syntaxhighlight>ملاحظة: تستطيع كتابة أي تلميح على النوع تحتاج إليه ضمن توقيع التابع <code>authorize</code>. ستُستبان تلقائيًا عبر حاوي خدمات Laravel. | </syntaxhighlight>ملاحظة: تستطيع كتابة أي تلميح على النوع تحتاج إليه ضمن توقيع التابع <code>authorize</code>. ستُستبان تلقائيًا عبر [[Laravel/container|حاوي خدمات]] Laravel. | ||
===تخصيص رسائل الخطأ=== | |||
=== تخصيص رسائل الخطأ === | |||
يمكنك تخصيص رسائل الخطأ المستخدمة من طرف طلب الاستمارة عن طريق إعادة تعريف التابع <code>messages</code>. يجب أن يردّ هذا التابع مصفوفة من أزواج خاصيّة / قاعدة ورسائل الخطأ المطابقة لها:<syntaxhighlight lang="php"> | يمكنك تخصيص رسائل الخطأ المستخدمة من طرف طلب الاستمارة عن طريق إعادة تعريف التابع <code>messages</code>. يجب أن يردّ هذا التابع مصفوفة من أزواج خاصيّة / قاعدة ورسائل الخطأ المطابقة لها:<syntaxhighlight lang="php"> | ||
سطر 246: | سطر 229: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==إنشاء مُتحقّقي الصحّة يدويًّا (Manually Creating Validators)== | |||
== إنشاء مُتحقّقي الصحّة يدويًّا (Manually Creating Validators) == | إن لم ترغب باستخدام التابع <code>validate</code> في الطلب، تستطيع إنشاء نسخة من متحقّق الصحّة يدويًا باستخدام واجهة Validator الساكنة. يُولّد التابع <code>make</code> في الواجهة الساكنة نسخة مُتحقّق جديدة:<syntaxhighlight lang="php"> | ||
إن لم ترغب باستخدام التابع validate في الطلب، تستطيع إنشاء نسخة من متحقّق الصحّة يدويًا باستخدام واجهة Validator الساكنة. يُولّد التابع make في الواجهة الساكنة نسخة مُتحقّق جديدة:<syntaxhighlight lang="php"> | |||
<?php | <?php | ||
سطر 285: | سطر 267: | ||
بعد فحص فشل التحقّق من صحة الطلب، تستطيع استخدام التابع <code>withErrors</code> لتمويض رسائل الخطأ للجلسة. عند استخدام هذا التابع، سيُشارك المتغيّر <code>$errors</code> تلقائيًا مع واجهاتك بعد إعادة التوجيه ممّا يسمح لك بعرضها بسهولة على المستخدم. يقبل التابع <code>withErrors</code> مُتحقّق و <code>MessageBag</code> أو array (مصفوفة) PHP. | بعد فحص فشل التحقّق من صحة الطلب، تستطيع استخدام التابع <code>withErrors</code> لتمويض رسائل الخطأ للجلسة. عند استخدام هذا التابع، سيُشارك المتغيّر <code>$errors</code> تلقائيًا مع واجهاتك بعد إعادة التوجيه ممّا يسمح لك بعرضها بسهولة على المستخدم. يقبل التابع <code>withErrors</code> مُتحقّق و <code>MessageBag</code> أو array (مصفوفة) PHP. | ||
===إعادة التوجيه التلقائيّة=== | |||
=== إعادة التوجيه التلقائيّة === | إن رغبت في إنشاء نسخة مُتحقّق يدويًا مع الاستفادة من إعادة التوجيه التلقائية التي يقّدمها تابع الطلبات <code>validate</code>، تستطيع مناداة التابع <code>validate</code> على نسخة مُتحقّق موجودة. سيُعاد توجيه المستخدم تلقائيًا إذا فشل التحقق من الصحّة أو في حالة طلب [[AJAX]] ستُرد استجابة [[JSON]]:<syntaxhighlight lang="php"> | ||
إن رغبت في إنشاء نسخة مُتحقّق يدويًا مع الاستفادة من إعادة التوجيه التلقائية التي يقّدمها تابع الطلبات <code>validate</code>، تستطيع مناداة التابع <code>validate</code> على نسخة مُتحقّق موجودة. سيُعاد توجيه المستخدم تلقائيًا إذا فشل التحقق من الصحّة أو في حالة طلب AJAX ستُرد استجابة JSON:<syntaxhighlight lang="php"> | |||
Validator::make($request->all(), [ | Validator::make($request->all(), [ | ||
'title' => 'required|unique:posts|max:255', | 'title' => 'required|unique:posts|max:255', | ||
سطر 293: | سطر 274: | ||
])->validate(); | ])->validate(); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===حقائب الأخطاء المسمّاة (Named Error Bags)=== | |||
=== حقائب الأخطاء المسمّاة (Named Error Bags) === | |||
قد ترغب في تسمية <code>MessageBag</code> من الأخطاء إن امتلكت عدّة استمارات على صفحة واحدة، ممّا يسمح لك باسترداد رسائل الخطأ الخاصة باستمارة معيّنة. مرّر اسمًا ما كالمتغيّر الوسيط الثاني إلى <code>withErrors</code>:<syntaxhighlight lang="php"> | قد ترغب في تسمية <code>MessageBag</code> من الأخطاء إن امتلكت عدّة استمارات على صفحة واحدة، ممّا يسمح لك باسترداد رسائل الخطأ الخاصة باستمارة معيّنة. مرّر اسمًا ما كالمتغيّر الوسيط الثاني إلى <code>withErrors</code>:<syntaxhighlight lang="php"> | ||
سطر 304: | سطر 284: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===خطاف التحقق من الصحة اللاحق (After Validation Hook)=== | |||
=== خطاف التحقق من الصحة اللاحق (After Validation Hook) === | يسمح لك المُتحقّق أيضًا بإرفاق ردود نداء للتشغيل بعد إكمال التحقق. يتيح لك هذا إجراء المزيد من التحقق بسهولة وإضافة المزيد من رسائل الخطأ لمجموعة الرسائل. استخدم التابع <code>after</code> للبدء على نسخة مُتحقّق من الصحة:<syntaxhighlight lang="php"> | ||
يسمح لك المُتحقّق أيضًا بإرفاق ردود نداء للتشغيل بعد إكمال التحقق. يتيح لك هذا إجراء المزيد من التحقق بسهولة وإضافة المزيد من رسائل الخطأ لمجموعة الرسائل. استخدم التابع after للبدء على نسخة مُتحقّق من الصحة:<syntaxhighlight lang="php"> | |||
$validator = Validator::make(...); | $validator = Validator::make(...); | ||
سطر 320: | سطر 299: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==التعامل مع رسائل الخطأ== | |||
== التعامل مع رسائل الخطأ == | |||
ستحصل، بعد مناداة التابع <code>errors</code> على نسخة <code>Validator</code> على نسخة <code>Illuminate\Support\MessageBag</code> والتي تحتوي على مجموعة متنوّعة من التوابع الملائمة للعمل مع رسائل الخطأ. يمثّل أيضًا المتغيّر <code>$errors</code> المتاح تلقائيًّا لجميع الواجهات نسخة من الصنف <code>MessageBag</code>. | ستحصل، بعد مناداة التابع <code>errors</code> على نسخة <code>Validator</code> على نسخة <code>Illuminate\Support\MessageBag</code> والتي تحتوي على مجموعة متنوّعة من التوابع الملائمة للعمل مع رسائل الخطأ. يمثّل أيضًا المتغيّر <code>$errors</code> المتاح تلقائيًّا لجميع الواجهات نسخة من الصنف <code>MessageBag</code>. | ||
====استرداد أول رسالة خطأ بالحقل (Retrieving The First Error Message For A Field)==== | |||
==== استرداد أول رسالة خطأ بالحقل (Retrieving The First Error Message For A Field) ==== | |||
استخدم التابع <code>first</code> لاسترداد أول رسالة خطأ لحقل معيّن:<syntaxhighlight lang="php"> | استخدم التابع <code>first</code> لاسترداد أول رسالة خطأ لحقل معيّن:<syntaxhighlight lang="php"> | ||
$errors = $validator->errors(); | $errors = $validator->errors(); | ||
سطر 339: | سطر 316: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
====التحقق من وجود الرسائل بالحقل==== | |||
==== التحقق من وجود الرسائل بالحقل ==== | |||
يمكن استخدام التابع <code>has</code> للتأكّد من وجود أي رسائل خطأ بحقل معيّن:<syntaxhighlight lang="php"> | يمكن استخدام التابع <code>has</code> للتأكّد من وجود أي رسائل خطأ بحقل معيّن:<syntaxhighlight lang="php"> | ||
if ($errors->has('email')) { | if ($errors->has('email')) { | ||
سطر 346: | سطر 322: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
===رسائل الخطأ المخصّصة=== | |||
=== رسائل الخطأ المخصّصة === | |||
تستطيع عند اللزوم استخدام رسائل خطأ مخصّصة للتحقق من الصحة بدلًا من الرسائل الافتراضية. توجد عدّة طرق لتحديد الرسائل المخصّصة. أولًا، تستطيع تمرير الرسائل المخصّصة كالمتغيّر الوسيط الثالث للتابع <code>Validator::make</code>:<syntaxhighlight lang="php"> | تستطيع عند اللزوم استخدام رسائل خطأ مخصّصة للتحقق من الصحة بدلًا من الرسائل الافتراضية. توجد عدّة طرق لتحديد الرسائل المخصّصة. أولًا، تستطيع تمرير الرسائل المخصّصة كالمتغيّر الوسيط الثالث للتابع <code>Validator::make</code>:<syntaxhighlight lang="php"> | ||
$messages = [ | $messages = [ | ||
سطر 362: | سطر 337: | ||
]; | ]; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
====تحديد رسالة مخصّصة لخاصيّة معيّنة==== | |||
==== تحديد رسالة مخصّصة لخاصيّة معيّنة ==== | |||
قد ترغب أحيانًا في تحديد رسائل خطأ مخصّصة لحقل معيّن فقط. تستطيع استخدام التدوين "نقطة". حدّد أولًا اسم الخاصيّة، متبوعًا بالقاعدة:<syntaxhighlight lang="php"> | قد ترغب أحيانًا في تحديد رسائل خطأ مخصّصة لحقل معيّن فقط. تستطيع استخدام التدوين "نقطة". حدّد أولًا اسم الخاصيّة، متبوعًا بالقاعدة:<syntaxhighlight lang="php"> | ||
$messages = [ | $messages = [ | ||
سطر 369: | سطر 343: | ||
]; | ]; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
====تحديد الرسائل المخصّصة في ملفات اللغة==== | |||
==== تحديد الرسائل المخصّصة في ملفات اللغة ==== | |||
في معظم الحالات، ستُحدّد غالبًا رسائلك المخصّصة في ملف لغة بدلًا من تمريرها مباشرة إلى المتحقّق <code>Validator</code>. أضف رسائلك إلى المصفوفة <code>custom</code> في ملف اللغة <code>resources/lang/xx/validation.php</code>.<syntaxhighlight lang="php"> | في معظم الحالات، ستُحدّد غالبًا رسائلك المخصّصة في ملف لغة بدلًا من تمريرها مباشرة إلى المتحقّق <code>Validator</code>. أضف رسائلك إلى المصفوفة <code>custom</code> في ملف اللغة <code>resources/lang/xx/validation.php</code>.<syntaxhighlight lang="php"> | ||
'custom' => [ | 'custom' => [ | ||
سطر 378: | سطر 351: | ||
], | ], | ||
</syntaxhighlight> | </syntaxhighlight> | ||
====تحديد خاصيّات مخصّصة في ملفات اللغة==== | |||
==== تحديد خاصيّات مخصّصة في ملفات اللغة ==== | |||
إن رغبت في استبدال الجزء <code>attribute:</code> من رسالة تحقّقك باسم خاصيّة مخصصة تستطيع تحديد الاسم المخصص في المصفوفة <code>attributes</code> لملف لغتك <code>resources/lang/xx/validation.php</code>:<syntaxhighlight lang="php"> | إن رغبت في استبدال الجزء <code>attribute:</code> من رسالة تحقّقك باسم خاصيّة مخصصة تستطيع تحديد الاسم المخصص في المصفوفة <code>attributes</code> لملف لغتك <code>resources/lang/xx/validation.php</code>:<syntaxhighlight lang="php"> | ||
'attributes' => [ | 'attributes' => [ | ||
سطر 385: | سطر 357: | ||
], | ], | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==قواعد التحقّق المتاحة== | |||
تجد أدناه قائمة بجميع قواعد التحقق المُتوفّرة ووظيفتها: | |||
* <code>Accepted</code> | |||
* <code>Active URL</code> | |||
* <code>(After (Date</code> | |||
* <code>(After Or Equal (Date</code> | |||
* <code>Alpha</code> | |||
* <code>Alpha Dash</code> | |||
* <code>Alpha Numeric</code> | |||
* <code>Array</code> | |||
* <code>Bail</code> | |||
* <code>(Before (Date</code> | |||
* <code>(Before Or Equal (Date</code> | |||
* <code>Between</code> | |||
* <code>Boolean</code> | |||
* <code>Confirmed</code> | |||
* <code>Date</code> | |||
* <code>Date Equals</code> | |||
* <code>Date Format</code> | |||
* <code>Different Digits</code> | |||
* <code>Digits Between</code> | |||
* <code>(Dimensions (Image Files</code> | |||
* <code>Distinct E-Mail</code> | |||
* <code>(Exists (Database</code> | |||
* <code>File</code> | |||
* <code>Filled</code> | |||
* <code>Greater Than</code> | |||
* <code>Greater Than Or Equal</code> | |||
* <code>(Image (File</code> | |||
* <code>In</code> | |||
* <code>In Array</code> | |||
* <code>Integer</code> | |||
* <code>IP Address</code> | |||
* <code>JSON</code> | |||
* <code>Less Than</code> | |||
* <code>Less Than Or Equal</code> | |||
* <code>Max</code> | |||
* <code>MIME Types</code> | |||
* <code>MIME Type By File Extension</code> | |||
* <code>Min</code> | |||
* <code>Not In</code> | |||
* <code>Not Regex</code> | |||
* <code>Nullable</code> | |||
* <code>Numeric</code> | |||
* <code>Present</code> | |||
* <code>Regular Expression</code> | |||
* <code>Required</code> | |||
* <code>Required If</code> | |||
* <code>Required Unless</code> | |||
* <code>Required With</code> | |||
* <code>Required With All</code> | |||
* <code>Required Without</code> | |||
* <code>Required Without All</code> | |||
* <code>Same</code> | |||
* <code>Size</code> | |||
* <code>String</code> | |||
* <code>Timezone</code> | |||
* <code>(Unique (Database</code> | |||
* <code>URL</code> | |||
==== <code>accepted</code> ==== | |||
يجب أن تكون قيمة الحقل قيد التحقّق yes ،on ،1، أو <code>true</code>. يفيد ذلك في التحقق من قبول "شروط الخدمة". | |||
==== <code>Active_url</code> ==== | |||
يجب على الحقل قيد التحقّق أن يكون تسجيلًا A أو AAAA حسب التابع <code>dns_get_record</code> PHP. | |||
==== <code>After:date</code> ==== | |||
يجب أن تكون قيمة الحقل تحت التحقّق بعد تاريخ معيّن. ستُمرّر التواريخ إلى الدالّة <code>strtotime</code> PHP:<syntaxhighlight lang="php"> | |||
'start_date' => 'required|date|after:tomorrow' | |||
</syntaxhighlight>تستطيع تحديد حقل آخر لتقارن التاريخ معه بدلًا من تمرير سلسلة تاريخ لتقيّمها <code>strtotime</code>:<syntaxhighlight lang="php"> | |||
'finish_date' => 'required|date|after:start_date' | |||
</syntaxhighlight> | |||
==== <code>After_or_equal:date</code> ==== | |||
يجب أن تكون قيمة الحقل تحت التحقق لاحقة أو مُساوية للتاريخ المحدّد. راجع القاعدة After لمزيد من المعلومات. | |||
==== <code>Alpha</code> ==== | |||
يجب أن يكون محتوى الحقل تحت التحقق أبجديًّا بالكامل. | |||
==== <code>Alpha_dash</code> ==== | |||
يمكن للحقل تحت التحقّق أن يحتوي على حروف أبجديّة أو رقميّة (alphanumeric) إضافةً إلى شرطات (dashes) وشرطات سفلية (underscore). | |||
==== <code>Alpha_num</code> ==== | |||
يجب أن يتكّون محتوى الحقل تحت التحقق من أحرف أبجديّة ورقميّة. | |||
==== <code>Array</code> ==== | |||
يجب أن يكون الحقل تحت التحقق مصفوفة PHP <code>array</code>. | |||
==== <code>bail</code> ==== | |||
إيقاف العمل بقواعد التحقق من الصحّة بعد فشل التحقّق الأوّل. | |||
==== <code>before:date</code> ==== | |||
يجب أن تكون قيمة الحقل تحت التحقّق سابقة للتاريخ المحدّد. ستُمرّر التواريخ للدالّة <code>strtotime</code> PHP. | |||
==== <code>before_or_equal:date</code> ==== | |||
يجب أن تكون قيمة الحقل تحت التحقّق سابقة أو مساوية للتاريخ المحدّد. ستُمرّر التواريخ للدالّة <code>strtotime</code> PHP. | |||
==== <code>between:min,max</code> ==== | |||
يجب أن يكون حجم الحقل تحت التحقق بين الحدّين الأدنى min والأقصى max. تقيّم السلاسل النصيّة والقيم العدديّة (numerics) والمصفوفات والملفات حسب نفس القاعدة size. | |||
==== <code>boolean</code> ==== | |||
يجب أن يكون ممكنًا وضع قيمة منطقيّة (boolean) بالحقل تحت التحقّق. الإدخالات المقبولة هي <code>true</code> و <code>false</code> و <code>1</code> و <code>0</code> و "<code>1</code>" و "<code>0</code>". | |||
==== <code>Confirmed</code> ==== | |||
يجب أن يكون للحقل تحت التحقق حقل مطابق <code>foo_confirmation</code>. إذا كان الحقل تحت التحقق كلمة سر <code>password</code> مثلا، يجب أن يوجد حقل مطابق <code>password_confirmation</code> في الإدخالات. | |||
==== <code>date</code> ==== | |||
يجب أن يكون الحقل تحت التحقق تاريخًا صالحًا وفقًا للدالّة <code>strtotime</code> PHP. | |||
==== <code>date_equals:date</code> ==== | |||
يجب أن تساوي قيمة الحقل تحت التحقق للتاريخ المحدّد. ستُمرّر التواريخ للدالّة <code>strtotime</code> PHP. | |||
==== <code>date_format:format</code> ==== | |||
يجب أن يطابق تنسيق الحقل تحت التحقّق التنسيق المحدد. عليك استخدام إما <code>date</code> أو <code>date_format</code> عند التحقق من صحة الحقل لا كليهما. | |||
==== <code>different:field</code> ==== | |||
يجب أن تكون قيمة الحقل تحت التحقق مختلفة عن <code>field</code>. | |||
==== <code>digits:value</code> ==== | |||
يجب أن تكون قيمة الحقل تحت التحقق رقميّة (numeric) ويجب أن يكون طولها <code>value</code>. | |||
==== <code>digits_between:min,max</code> ==== | |||
يجب أن يكون طول الحقل تحت التحقق بين الحدّين الأدنى min والأقصى max المحدّدين. | |||
==== <code>dimensions</code> ==== | |||
يجب أن يكون الملف تحت التحقّق صورة تلتزم بقيود الأبعاد المُحدّدة بمعاملات القاعدة:<syntaxhighlight lang="php"> | |||
'avatar' => 'dimensions:min_width=100,min_height=200' | |||
</syntaxhighlight>القيود المتاحة هي: <code>min_width</code> ،<code>max_width</code> ،<code>min_height</code> ،<code>max_height</code> ،<code>width</code> ،<code>height</code> ،<code>ratio</code>. | |||
يجب تمثيل قيد النسبة (<code>ratio</code>) كالعرض مقسومًا على الطول. يمكن تحديد هذا إمّا بكسر مثل <code>3/2</code> أو عدد عشري (float) مثل <code>1.5</code>:<syntaxhighlight lang="php"> | |||
'avatar' => 'dimensions:ratio=3/2' | |||
</syntaxhighlight>تستطيع استخدام التابع <code>Rule::dimensions</code> بما أنّ هذه القاعدة تتطلّب عدّة متغيّرات وسيطة لبنائها بسلاسة:<syntaxhighlight lang="php"> | |||
use Illuminate\Validation\Rule; | |||
Validator::make($data, [ | |||
'avatar' => [ | |||
'required', | |||
Rule::dimensions()->maxWidth(1000)->maxHeight(500)->ratio(3 / 2), | |||
], | |||
]); | |||
</syntaxhighlight> | |||
==== <code>distinct</code> ==== | |||
يجب أن يخلو الحقل تحت التحقق من أي قيم مكررة عند العمل بالمصفوفات.<syntaxhighlight lang="php"> | |||
'foo.*.id' => 'distinct' | |||
</syntaxhighlight> | |||
==== <code>email</code> ==== | |||
يجب تنسيق الحقل تحت التحقّق كعنوان بريد إلكتروني. | |||
==== <code>Exists:table,column</code> ==== | |||
يجب أن يوجد الحقل تحت التحقّق في جدول قاعدة بيانات المحدّد. | |||
==== الاستخدام الأساسي للقاعدة <code>Exists</code> ==== | |||
<syntaxhighlight lang="php"> | |||
'state' => 'exists:states' | |||
</syntaxhighlight>إن لم يُحدّد الخيار <code>column</code> سيُستخدام اسم الحقل. | |||
==== تحديد اسم عمود مخصص ==== | |||
<syntaxhighlight lang="php"> | |||
'state' => 'exists:states,abbreviation' | |||
</syntaxhighlight>قد تحتاج من حين لآخر لتحديد اتصال قاعدة بيانات محدّد لاستخدامه في الاستعلام <code>exists</code>. تستطيع تحقيق ذلك عن طريق إضافة اسم الاتصال لاسم الجدول باستخدام التنقيط "نقطة":<syntaxhighlight lang="php"> | |||
'email' => 'exists:connection.staff,email' | |||
</syntaxhighlight>تستطيع إن رغبت في تخصيص الاستعلام الذي تنفذّه قاعدة التحقّق استخدام الصنف <code>Rule</code> لتعريف القاعدة بسلاسة. سنحدد أيضًا في هذا المثال قواعد التحقّق من الصحّة في مصفوفة بدلًا من استخدام الحرف | لتحديدها:<syntaxhighlight lang="php"> | |||
use Illuminate\Validation\Rule; | |||
Validator::make($data, [ | |||
'email' => [ | |||
'required', | |||
Rule::exists('staff')->where(function ($query) { | |||
$query->where('account_id', 1); | |||
}), | |||
], | |||
]); | |||
</syntaxhighlight> | |||
==== <code>file</code> ==== | |||
يجب أن يكون الحقل تحت التحقق ملفًا محمّلًا بنجاح. | |||
==== <code>filled</code> ==== | |||
يجب ألّا يكون الحقل تحت التحقق فارغًا إن وُجد. | |||
==== <code>gt:field</code> ==== | |||
يجب أن يكون الحقل تحت التحقّق أكبر من الحقل المحدّد <code>field</code>. يجب أن يكون الحقلان من نفس النوع. تُقيّم السلاسل النصيّة، والقيم العدديّة، والمصفوفات، والملفات حسب نفس القاعدة <code>size</code>. | |||
==== <code>Gte:field</code> ==== | |||
يجب أن يكون الحقل تحت التحقق من الصحّة أكبر أو مساوي للحقل المحدّد <code>field</code>. يجب أن يكون الحقلان من نفس النوع. تُقيّم السلاسل النصيّة، والقيم العدديّة، والمصفوفات، والملفات حسب نفس القاعدة <code>size</code>. | |||
==== <code>image</code> ==== | |||
يجب أن يكون الحقل تحت التحقق صورة (jpeg أو png أو bmp أو gif أو svg). | |||
==== <code>..,in:foo,bar</code> ==== | |||
يجب تضمين الحقل تحت التحقق من الصحة في قائمة القيم المحدّدة. وبما أنّ هذه القاعدة تتطلب منك غالبًا أن تستخدم التابع <code>implode</code> على المصفوفة (يجمِع التابع <code>implode</code> عناصر مصفوفة لتشكِّل سلسلةً نصيةً)، تستطيع استخدام التابع <code>Rule::in</code> لإنشاء القاعدة بسلاسة:<syntaxhighlight lang="php"> | |||
use Illuminate\Validation\Rule; | |||
Validator::make($data, [ | |||
'zones' => [ | |||
'required', | |||
Rule::in(['first-zone', 'second-zone']), | |||
], | |||
]); | |||
</syntaxhighlight> | |||
==== <code>in_array:anotherfield</code> ==== | |||
يجب أن يوجد محتوى الحقل تحت التحقق ضمن قيم حقل آخر <code>anotherfield</code>. | |||
==== <code>integer</code> ==== | |||
يجب أن يكون الحقل تحت التحقق عددًا صحيحًا طبيعيًّا. | |||
==== <code>ip</code> ==== | |||
يجب أن يكون الحقل تحت التحقّق عنوان IP. | |||
==== <code>ipv4</code> ==== | |||
يجب أن يكون الحقل تحت التحقق من الصحة عنوان IPv4. | |||
==== <code>ipv6</code> ==== | |||
يجب أن يكون الحقل تحت التحقق من الصحة عنوان IPv6. | |||
==== <code>json</code> ==== | |||
يجب أن يكون الحقل تحت التحقّق سلسلة [[JSON]] صالحة. | |||
==== <code>lt:field</code> ==== | |||
يجب أن تكون قيمة الحقل تحت التحقق أصغر من قيمة الحقل المحدّد <code>field</code>. يجب أن يكون الحقلان من نفس النوع. تُقيّم السلاسل النصيّة، والقيم العدديّة، والمصفوفات، والملفات حسب نفس القاعدة <code>size</code>. | |||
==== <code>lte:field</code> ==== | |||
يجب أن تكون قيمة الحقل تحت التحقق أقل أو مساوية لقيمة الحقل المحدّد <code>field</code>. يجب أن يكون الحقلان من نفس النوع. تُقيّم السلاسل النصيّة، والقيم العدديّة، والمصفوفات، والملفات حسب نفس القاعدة <code>size</code>. | |||
==== <code>max:value</code> ==== | |||
يجب أن تكون قيمة الحقل تحت التحقق أقل من القيمة المحدّدة value. تُقيّم السلاسل النصيّة، والقيم العدديّة، والمصفوفات، والملفات حسب نفس القاعدة <code>size</code>. | |||
==== <code>...,mimetypes:text/plain</code> ==== | |||
يجب أن يُطابق الملف تحت التحقق أحد الأنواع MIME المحدّدة:<syntaxhighlight lang="php"> | |||
'video' => 'mimetypes:video/avi,video/mpeg,video/quicktime' | |||
</syntaxhighlight>لتحديد النوع MIME للملف المُحمّل، ستُقرأ محتويات الملف وسيحاول الإطار تخمين النوع MIME والذي قد يكون مختلفًا عن نوع MIME الذي قدّمه العميل. | |||
==== <code>...,mimes:foo,bar</code> ==== | |||
يجب أن يحتوي الملف تحت التحقّق على نوع MIME يتوافق مع إحدى الإضافات المدرجة. | |||
==== الاستخدام الأساسي للقاعدة MIME ==== | |||
<syntaxhighlight lang="php"> | |||
'photo' => 'mimes:jpeg,bmp,png' | |||
</syntaxhighlight>تتحقق هذه القاعدة بالفعل من نوع MIME للملف بقراءة محتوياته ثم تخمين النوع MIME رغم أنك تحتاج فقط لتحديد الامتدادات. | |||
يمكن العثور على قائمة كاملة لأنواع MIME وامتداداتها المقابلة في الموقع التالي:https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types | |||
==== <code>Min:value</code> ==== | |||
يجب أن يكون للحقل تحت التحقق حد قيمة أدنى value. تُقيّم السلاسل النصيّة، والقيم العدديّة، والمصفوفات، والملفات حسب نفس القاعدة <code>size</code>. | |||
==== <code>...,not_in:foo,bar</code> ==== | |||
يجب ألّا يوجد الحقل تحت التحقق في قائمة القيم المحددة. يمكن استخدام التابع <code>Rule::notIn</code>:<syntaxhighlight lang="php"> | |||
use Illuminate\Validation\Rule; | |||
Validator::make($data, [ | |||
'toppings' => [ | |||
'required', | |||
Rule::notIn(['sprinkles', 'cherries']), | |||
], | |||
]); | |||
</syntaxhighlight> | |||
==== <code>not_regex:pattern</code> ==== | |||
يجب ألّا يطابق الحقل تحت التحقّق التعبير النمطي (regular expression) المحدّد. | |||
ملاحظة: عند استخدام الأنماط <code>regex</code> / <code>not_regex</code>، قد يكون تحديد القواعد في مصفوفة بدلًا من استخدام محددات أشرطة عموديّة (pipe delimiters أي "|") ضروريًّا، خاصة إذا كان التعبير النمطي يحتوي على خط عمودي (pipe character). | |||
==== <code>nullable</code> ==== | |||
يمكن أن يكون الحقل تحت التحقّق ذا قيمة فارغة <code>null</code>. نرى فائدة هذه القاعدة خاصة عند التحقق من صحة بيانات بدائيّة (primitive) مثل السلاسل النصيّة والأعداد الصحيحة الطبيعيّة التي قد تحتوي على قيم <code>null</code>. | |||
==== <code>numeric</code> ==== | |||
يجب أن يكون الحقل تحت التحقّق عدديّا. | |||
==== <code>present</code> ==== | |||
يجب أن يوجد الحقل تحت التحقّق في بيانات الإدخال لكن يمكن أن يظل فارغًا. | |||
==== <code>regex:pattern</code> ==== | |||
يجب أن يطابق الحقل تحت التحقّق التعبير النمطي (regular expression) المحدّد. | |||
ملاحظة: عند استخدام الأنماط <code>regex</code> / <code>not_regex</code> قد يكون تحديد القواعد في مصفوفة بدلاً من استخدام محددات أشرطة عموديّة (pipe delimiters أي "|") ضروريًّا، خاصة إذا كان التعبير العادي يحتوي على خط عمودي (pipe character). | |||
==== <code>Required</code> ==== | |||
يجب أن يوجد الحقل تحت التحقق في بيانات الإدخال وألّا يكون فارغًا. يعتبر الحقل "فارغًا" إن تحقّقت أحد الشروط التالية: | |||
* القيمة <code>null</code> . | |||
* القيمة سلسلة نصيّة فارغة. | |||
* القيمة مصفوفة فارغة أو كائن <code>Countable</code> فارغ. | |||
* القيمة ملف مُحمّل بدون مسار. | |||
==== <code>...,Required_if:anotherfield,value</code> ==== | |||
يجب أن يوجد الحقل تحت التحقق وأن لا يكون فارغًا إذا ساوى الحقل <code>anotherfield</code> أيّ قيمة value. | |||
==== <code>...,required_unless:anotherfield,value</code> ==== | |||
يجب أن يوجد الحقل تحت التحقق وأن لا يكون فارغًا إلّا إذا لم يوجد الحقل <code>anotherfield</code> أيّ قيمة value. | |||
== | ==== <code>...,required_with:foo,bar</code> ==== | ||
يجب أن يوجد الحقل تحت التحقق وأن لا يكون فارغًا فقط إن وُجد أي من الحقول الأخرى المُحدّدة. | |||
==== <code>...,required_with_all:foo,bar</code> ==== | |||
يجب أن يوجد الحقل تحت التحقق وأن لا يكون فارغًا فقط إن وُجدت كل الحقول الأخرى المُحدّدة. | |||
==== <code>...,required_without:foo,bar</code> ==== | |||
يجب أن يوجد الحقل تحت التحقق وأن لا يكون فارغًا فقط إن لم يوجد أي من الحقول الأخرى المُحدّدة. | |||
==== <code>...,required_without_all:foo,bar</code> ==== | |||
يجب أن يوجد الحقل تحت التحقق وأن لا يكون فارغًا فقط إن لم توجد كل الحقول الأخرى المُحدّدة. | |||
==== <code>same:field</code> ==== | |||
يجب أن يطابق الحقل المُحدّد الحقل تحت التحقّق. | |||
==== <code>size:value</code> ==== | |||
يجب أن يطابق حجم الحقل تحت التحقق القيمة المحددة. تعني القيمة بالنسبة للبيانات النصيّةعدد الأحرف. القيمة هي القيمة العدديّة المحدّدة بالنسبة للبيانات الرقمية. بالنسبة للمصفوفة، الحجم يُوافق count المصفوفة. بالنسبة للملفات، الحجم هو حجم الملف بالكيلوبايت. | |||
==== <code>string</code> ==== | |||
يجب أن يكون الحقل تحت التحقق سلسلة نصيّة. إن رغبت في السماح للحقل بأن يكون أيضًا <code>null</code>، عن القاعدة <code>nullable</code> على الحقل. | |||
==== <code>timezone</code> ==== | |||
يجب أن يكون الحقل ضمن التحقق مُعرّف منطقة زمنيّة صالحا وفقًا للدالّة <code>timezone_identifiers_list</code> PHP. | |||
==== <code>unique:table,column,except,idColumn</code> ==== | |||
يجب أن يكون الحقل تحت التحقق فريدًا في جدول قاعدة بيانات محدّد. فسيُستخدم اسم الحقل إن لم يُحدّد الخيار <code>column</code>. | |||
===== تحديد اسم عمود مخصص ===== | |||
<syntaxhighlight lang="php"> | |||
'email' => 'unique:users,email_address' | |||
</syntaxhighlight> | |||
===== اتصال قاعدة البيانات المخصّص (Custom Database Connection) ===== | |||
قد تحتاج من حين لآخر لتعيين اتصال مخصّص لاستعلامات قاعدة البيانات التي يُجريها المُتحقّق. سيستخدم إعداد <code>unique:users</code> كقاعدة تحقّق من الصحّة كما رأينا أعلاه اتصال قاعدة البيانات الافتراضي للاستعلام عن قاعدة البيانات. لإعادة تعريف هذا الإعداد، حدّد الاتصال واسم الجدول باستخدام التنقيط "نقطة":<syntaxhighlight lang="php"> | |||
'email' => 'unique:connection.users,email_address' | |||
</syntaxhighlight> | |||
===== إجبار قاعدة فريدة على تجاهل معرّف (ID) معيّن ===== | |||
قد ترغب أحيانًا في تجاهل معرّف معيّن أثناء الفحص الفريد. افترض مثلًا شاشة "تحديث الملف الشخصي" والتي تتضمّن اسم المستخدم وعنوان البريد الإلكتروني والموقع. ستحتاج طبعا للتحقق من فرادة عنوان البريد الإلكتروني. ولكن لن ترغب طرح خطأ إن غيّر المستخدم حقل الاسم فقط لا حقل البريد الإلكتروني لأن المستخدم يمتلك بالفعل عنوان البريد الإلكتروني. | |||
لإعطاء المُتحقّق تعليمات تجاهل معرّف المستخدم (ID)، نستخدم الصنف <code>Rule</code> لتعريف القاعدة بسلاسة. سنحدّد في هذا المثال أيضًا قواعد التحقّق من الصحّة في مصفوفة بدلًا من استخدام الحرف <code>|</code> للفصل بين القواعد:<syntaxhighlight lang="php"> | |||
use Illuminate\Validation\Rule; | |||
Validator::make($data, [ | |||
'email' => [ | |||
'required', | |||
Rule::unique('users')->ignore($user->id), | |||
], | |||
]); | |||
</syntaxhighlight>تستطيع إن استخدم جدولك اسم عمود مفتاح أوّلي غير <code>id</code> تحديد اسم العمود عند مناداة التابع <code>ignore</code>:<syntaxhighlight lang="php"> | |||
'email' => Rule::unique('users')->ignore($user->id, 'user_id') | |||
</syntaxhighlight> | |||
=== إضافة شروط Where أخرى (Adding Additional Where Clauses): === | |||
تستطيع أيضًا تحديد قيود استعلام إضافية بتخصيص الاستعلام باستخدام التابع <code>where</code>. فلنضف على سبيل المثال قيدًا يتحقّق من أن <code>account_id</code> يساوي <code>1</code>:<syntaxhighlight lang="php"> | |||
'email' => Rule::unique('users')->where(function ($query) { | |||
return $query->where('account_id', 1); | |||
}) | |||
</syntaxhighlight> | |||
==== <code>url</code> ==== | |||
يجب أن يكون الحقل تحت التحقّق عنوان <code>URL</code> صالح. | |||
== إضافة القواعد المشروطة == | |||
==== التحقّق من الصحّة عند الحضور ==== | |||
قد ترغب في بعض الحالات بتشغيل التحقّق من صحّة حقل فقط إذا كان هذا الحقل موجودًا في مصفوفة الإدخال. أضف القاعدة <code>sometimes</code> إلى قائمة قواعدك لإتمام هذا بسرعة:<syntaxhighlight lang="php"> | |||
$v = Validator::make($data, [ | |||
'email' => 'sometimes|required|email', | |||
]); | |||
</syntaxhighlight>في المثال أعلاه ، لن يُقبل الحقل <code>email</code> إلا إن وجد في المصفوفة <code>data$</code>. | |||
'''ملاحظة''': إذا كنت تحاول التحقق من صحّة حقل واجب الوجود لكن مع احتمال كونه فارغًا فراجع هذه الملاحظة في الحقول الاختيارية. | |||
==== التحقق المشروط المعقّد (Complex Conditional Validation) ==== | |||
قد ترغب أحيانًا في إضافة قواعد تحقّق استنادًا على منطق شرطي أكثر تعقيدًا. قد ترغب على سبيل المثال في اشتراط حقل محدّد فقط إن امتلك حقل آخر قيمة أكبر من 100. أو قد تحتاج لامتلاك حقلين ذوي قيمة معيّنة فقط عند وجود حقل آخر. يجب أن تكون إضافة هذه القواعد سهلة. أولاً، أنشئ نسخة <code>Validator</code> بقواعدتك الثابتة التي لا تتغير أبدًا:<syntaxhighlight lang="php"> | |||
$v = Validator::make($data, [ | |||
'email' => 'required|email', | |||
'games' => 'required|numeric', | |||
]); | |||
</syntaxhighlight>لنفترض أن تطبيقنا الويب مخصّص لهواة جمع الألعاب. إن سجّل جامع ألعاب نفسه بتطبيقنا وامتلك أكثر من 100 لعبة سنرغب بأن يشرح لنا سبب امتلاكه هذا العدد الكبير من الألعاب. ربما مثلًا يديرون متجرًا لبيع الألعاب أو لربما يستمتعون بالتجميع فقط. يمكننا استخدام التابع <code>sometimes</code> لإضافة هذا الشرط بشكل شرطي في النسخة <code>Validator</code>.<syntaxhighlight lang="php"> | |||
$v->sometimes('reason', 'required|max:500', function ($input) { | |||
return $input->games >= 100; | |||
}); | |||
</syntaxhighlight>يمثّل المتغيّر الوسيط الأوّل المُمرّر إلى التابع <code>sometimes</code> اسم الحقل الذي نتحقّق منه شرطيًّا. المتغيّر الوسيط الثاني هو القواعد التي نود إضافتها. إذا ردّ <code>Closure</code> المُمرّر كالمتغيّر الثالث القيمة <code>true</code> ستُضاف القواعد. تجعل هذه الطريقة بناء عمليات التحقق الشرطية المعقدة سهلة جدّا. يمكنك حتى إضافة عمليات تحقّق شرطي لعدّة حقول في المرّة:<syntaxhighlight lang="php"> | |||
$v->sometimes(['reason', 'cost'], 'required', function ($input) { | |||
return $input->games >= 100; | |||
}); | |||
</syntaxhighlight>'''ملاحظة''': ستكون المعاملة <code>$input</code> المُمرّرة إلى <code>Closure</code> نسخة من <code>Illuminate\Support\Fluent</code> ويمكن استخدامها للوصول إلى إدخالاتك وملفّاتك. | |||
== التحقق من المصفوفات == | |||
لا يجب أن يكون التحقق من صحّة حقول الإدخال المصفوفة صعبًا. تستطيع استخدام "النقطة" للتحقق من صحة الخاصيّات داخل المصفوفة. تستطيع إن احتوى الطلب HTTP الوارد مثلًا على حقل <code>photos[profile]</code> التحقق من صحته كما يلي:<syntaxhighlight lang="php"> | |||
$validator = Validator::make($request->all(), [ | |||
'photos.profile' => 'required|image', | |||
]); | |||
</syntaxhighlight>تستطيع أيضًا التحقق من صحّة كل عنصر في المصفوفة على حدة. تستطيع مثلًا التحقق من فرادة كل بريد إلكتروني في حقل إدخال مصفوفة كما يلي:<syntaxhighlight lang="php"> | |||
$validator = Validator::make($request->all(), [ | |||
'person.*.email' => 'email|unique:users', | |||
'person.*.first_name' => 'required_with:person.*.last_name', | |||
]); | |||
</syntaxhighlight>تستطيع أيضًا استخدام الحرف <code>*</code> عند تحديد رسائل تحقّقك في ملفات لغتك، ممّا يُسهّل استخدام رسالة تحقّق واحدة للحقول المستندة على مصفوفة:<syntaxhighlight lang="php"> | |||
'custom' => [ | |||
'person.*.email' => [ | |||
'unique' => 'Each person must have a unique e-mail address', | |||
] | |||
], | |||
</syntaxhighlight> | |||
== قواعد التحقق المخصص == | |||
=== استخدام كائنات القاعدة === | |||
يوفر [[Laravel]] مجموعة متنوعة من قواعد التحقق المفيدة؛ قد ترغب مع ذلك في تحديد بعض قواعدك الخاصّة. استخدام كائنات القاعدة هي إحدى طرق تسجيل قواعد التحقق المخصّصة. تستطيع استخدام الأمر <code>make:rule</code> Artisan لتوليد كائن قاعدة جديد. فلنستخدم هذا الأمر لتوليد قاعدة تتحقّق من كون حروف سلسلة نصيّة كبيرة. سيضع [[Laravel]] القاعدة الجديدة في المُجلّد <code>app/Rules</code>:<syntaxhighlight lang="php"> | |||
php artisan make:rule Uppercase | |||
</syntaxhighlight>نحن مستعدون لتعريف سلوك القاعدة بمجرد إنشائها. يحتوي كائن القاعدة على تابعين: <code>passes</code> و <code>message</code>. يتلقى التابع <code>passes</code> قيمة الخاصيّة واسمها يجب أن يردّ القيمة <code>true</code> أو القيمة <code>false</code> استنادًا على صلاحيّة قيمة الخاصيّة. يجب أن يرد التابع <code>message</code> رسالة خطأ التحقق التي يجب استخدامها عند فشل التحقق من الصحّة:<syntaxhighlight lang="php"> | |||
<?php | |||
namespace App\Rules; | |||
use Illuminate\Contracts\Validation\Rule; | |||
class Uppercase implements Rule | |||
{ | |||
/** | |||
* تحديد إذا مرّت قاعدة التحقق أم لا. | |||
* | |||
* @param string $attribute | |||
* @param mixed $value | |||
* @return bool | |||
*/ | |||
public function passes($attribute, $value) | |||
{ | |||
return strtoupper($value) === $value; | |||
} | |||
/** | |||
* Get the validation error message. | |||
* | |||
* @return string | |||
*/ | |||
public function message() | |||
{ | |||
return 'The :attribute must be uppercase.'; | |||
} | |||
} | |||
</syntaxhighlight>تستطيع طبعًا مناداة المساعد <code>trans</code> من تابعك <code>message</code> إذا رغبت في رد رسالة خطأ من ملفات ترجمتك:<syntaxhighlight lang="php"> | |||
/** | |||
* Get the validation error message. | |||
* | |||
* @return string | |||
*/ | |||
public function message() | |||
{ | |||
return trans('validation.uppercase'); | |||
} | |||
</syntaxhighlight>تستطيع إرفاق القاعدة بعد تعريفها بمُتحقّق عبر تمرير نسخة من كائن القاعدة مع قواعد تحقّقك الأخرى:<syntaxhighlight lang="php"> | |||
use App\Rules\Uppercase; | |||
$request->validate([ | |||
'name' => ['required', 'string', new Uppercase], | |||
]); | |||
</syntaxhighlight> | |||
=== استخدام Closures === | |||
تستطيع إن احتجت لوظيفة (functionality) القاعدة المخصّصة مرة واحدة فقط في التطبيق استخدام Closure بدلًا من كائن القاعدة. يتلقى Closure اسم الخاصيّة وقيمة الخاصيّة وردّ نداء <code>fail$</code> يجب مناداته في حالة فشل التحقق من الصحّة:<syntaxhighlight lang="php"> | |||
$validator = Validator::make($request->all(), [ | |||
'title' => [ | |||
'required', | |||
'max:255', | |||
function($attribute, $value, $fail) { | |||
if ($value === 'foo') { | |||
return $fail($attribute.' is invalid.'); | |||
} | |||
}, | |||
], | |||
]); | |||
</syntaxhighlight> | |||
=== استخدام الإضافات === | |||
توجد طريقة أخرى لتسجيل قواعد التحقق المخصّصة وهي استخدام التابع <code>extend</code> على الواجهة الساكنة <code>Validator</code>. فلنستخدم هذا التابع داخل موفّر الخدمات لتسجيل قاعدة تحقّق مخصّصة:<syntaxhighlight lang="php"> | |||
<?php | |||
namespace App\Providers; | |||
use Illuminate\Support\ServiceProvider; | |||
use Illuminate\Support\Facades\Validator; | |||
class AppServiceProvider extends ServiceProvider | |||
{ | |||
/** | |||
* مهّد أي خدمات التطبيق. | |||
* | |||
* @return void | |||
*/ | |||
public function boot() | |||
{ | |||
Validator::extend('foo', function ($attribute, $value, $parameters, $validator) { | |||
return $value == 'foo'; | |||
}); | |||
} | |||
/** | |||
* Register the service provider. | |||
* | |||
* @return void | |||
*/ | |||
public function register() | |||
{ | |||
// | |||
} | |||
} | |||
</syntaxhighlight>تستطيع أيضًا تمرير صنف وتابع للتابع <code>extend</code> بدلًا من Closure:<syntaxhighlight lang="php"> | |||
Validator::extend('foo', 'FooValidator@validate'); | |||
</syntaxhighlight> | |||
==== تعريف رسالة الخطأ ==== | |||
ستحتاج أيضًا لتعريف رسالة خطأ لقاعدتك المخصّصة. يمكنك ذلك إما باستخدام مصفوفة رسائل مخصصة مباشرة (inline) أو بإضافة مدخل في ملف لغة التحقّق. يجب وضع هذه الرسالة في أول مستوى من المصفوفة لا ضمن المصفوفة <code>custom</code> فهي مجعولة لرسائل خطأ الخاصيّات فقط:<syntaxhighlight lang="php"> | |||
"foo" => "Your input was invalid!", | |||
"accepted" => "The :attribute must be accepted.", | |||
// باقي رسائل أخطاء التحقق من الصحة ... | |||
</syntaxhighlight>قد تحتاج أحيانًا عند إنشاء قاعدة تحقّق مخصّصة لتعريف بدائل () مخصّصة لرسائل الخطأ. يمكنك ذلك عبر إنشاء متحقّق مخصّص كما هو موضح أعلاه ثم مناداة التابع <code>replacer</code> على الواجهة الساكنة <code>Validator</code> . تستطيع ذلك بفضل التابع <code>boot</code> موفّر الخدمات:<syntaxhighlight lang="php"> | |||
/** | |||
* مهّد أي خدمات التطبيق. | |||
* | |||
* @return void | |||
*/ | |||
public function boot() | |||
{ | |||
Validator::extend(...); | |||
Validator::replacer('foo', function ($message, $attribute, $rule, $parameters) { | |||
return str_replace(...); | |||
}); | |||
} | |||
</syntaxhighlight> | |||
==== الإضافات الضمنية (Implicit Extensions) ==== | |||
عند التحقق من خاصيّة غير موجودة أو تحتوي على قيمة فارغة، كما حُدّد في القاعدة <code>required</code>، لا تُشغّل قواعد التحقّق العادية بما في ذلك الملحقات المخصّصة. لن تُشغّل القاعدة <code>unique</code> على قيمة <code>null</code>:<syntaxhighlight lang="php"> | |||
$rules = ['name' => 'unique']; | |||
$input = ['name' => null]; | |||
Validator::make($input, $rules)->passes(); // true | |||
</syntaxhighlight> | |||
كي تشغّل القاعدة حتى عند خلّو إحدى الخاصيّات، على القاعدة أن تشير ضمنيًّا (imply) لكونها مطلوبة. لإنشاء مثل هذا الامتداد "الضمني"، استخدم التابع <code>()Validator::extendImplicit</code>:<syntaxhighlight lang="php"> | |||
Validator::extendImplicit('foo', function ($attribute, $value, $parameters, $validator) { | |||
return $value == 'foo'; | |||
}); | |||
</syntaxhighlight>'''ملاحظة''': كل ما تفعله الملحقة "الضمنية" هو الإشارة لكون الخاصيّة مطلوبة. أنت من يقرر بعدها بطلان الخاصيّة المفقودة أو الفارغة. | |||
== مصادر == | |||
* [https://laravel.com/docs/5.6/validation صفحة Validation في توثيق Laravel الرسمي.] | |||
[[تصنيف:Laravel|{{SUBPAGENAME}}]] | |||
[[تصنيف:Laravel Basics|{{SUBPAGENAME}}]] |
المراجعة الحالية بتاريخ 13:49، 8 يناير 2021
يوفّر Laravel عدّة طرق مختلفة للتحقّق من صحّة البيانات الواردة للتطبيقك. يستخدم صنف وحدة التحكّم الأساسي في Laravel الخاصيّة ValidatesRequests
التي توفّر طريقة ملائمة للتحقق من صحة الطلب HTTP الوارد بمجموعة متنوّعة من قواعد التحقق الفعّالة.
بداية سريعة في التحقّق
لمعرفة المزيد عن ميزات التحقق الفعالة في Laravel، دعنا نلقي نظرة على مثال كامل من التحقق من صحّة استمارة وعرض رسائل الخطأ على المستخدم.
تعريف المسارات
لنفترض أولًا أنّ لدينا المسارات التالية المحدّدة في ملفّنا routes/web.php
:
Route::get('post/create', 'PostController@create');
Route::post('post', 'PostController@store');
سيعرض المسار GET استمارة للمستخدم لإنشاء منشور مدوّنة جديد بينما سيخزّن المسار POST منشور المدونة الجديد في قاعدة البيانات.
إنشاء وحدة التحكّم
فلنلقي في الخطوة التالية نظرة على وحدة تحكم بسيطة تتعامل مع هذه المسارات. سنترك التابع store
فارغًا حاليًّا:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class PostController extends Controller
{
/**
* إظهار الاستمارة لإنشاء منشور مدوّنة جديد
*
* @return Response
*/
public function create()
{
return view('post.create');
}
/**
* إنشاء منشور مدوّنة جديد
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
// تحقّق وتخزّن المنشور الجديد ...
}
}
كتابة منطق التحقّق
نحن الآن مُستعدّون لملء التابع store
بالمنطق للتحقق من مشاركة المدوّنة الجديدة. لذلك، سنستخدم التابع validate
المقدّم من الكائن Illuminate\Http\Request
. إذا نجحت قواعد التحقّق، ستواصل التعليمات البرمجيّة التنفيذ بشكل طبيعي؛ ولكن في حالة فشل التحقق من الصحّة، سيُطرح استثناء وتُرسل استجابة الخطأ المناسبة إلى المستخدم تلقائيًا. ستُنشئ في حالة طلب HTTP تقليدي استجابة إعادة توجيه، في حين تُرسل استجابة JSON لطلبات AJAX.
لفهم التابع validate
بشكل أفضل، فلنعد مرّة أخرى إلى التابع store
:
/**
* تخزين منشور المدوّنة الجديد
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$validatedData = $request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
// منشور المدونة صالح ...
}
كما ترى نُمرّر قواعد التحقق المرغوبة للتابع validate
. ومرّة أخرى، إذا فشل التحقّق من الصحّة، ستُنشئ الاستجابة المناسبة تلقائيًا. إن نجحت عمليّة التحقّق، ستستمر وحدة تحكّمنا في العمل بشكل طبيعي.
التوقف عند أوّل فشل تحقّق
قد ترغب أحيانًا في إيقاف تشغيل قواعد التحقق من صحّة خاصيّة (attribute) ما بعد أول فشل في التحقّق. للقيام بذلك، عيّن القاعدة bail على السمة:
$request->validate([
'title' => 'bail|required|unique:posts|max:255',
'body' => 'required',
]);
في هذا المثال، إذا فشلت القاعدة unique مع الخاصيّة title
، لن يتحقّق من القاعدة max. سيتم التحقق من القواعد بالترتيب الذي عُيّنت عليه.
ملاحظة حول الخاصيات المتداخلة
تستطيع تحديد معاملاتك 'المتداخلة"، إن احتوى طلبك HTTP عليها، في قواعد تحقّقك باستخدام الصيغة "نقطة":
$request->validate([
'title' => 'required|unique:posts|max:255',
'author.name' => 'required',
'author.description' => 'required',
]);
عرض أخطاء التحقق
لكن ماذا لو لم تتجاوز معاملات الطلب الوارد قواعد التحقق المحددة؟ كما ذكرنا سابقًا، سيُعيد Laravel توجيه المستخدم تلقائيًا إلى موقعه السابق. بالإضافة إلى ذلك، ستومض جميع أخطاء التحقق تلقائيًا إلى الجلسة.
مرة أخرى، لاحظ أننا لم نضطر لربط رسائل الخطأ صراحة بالواجهة في مسارنا GET
. ويرجع ذلك لتحقّق Laravel من وجود أخطاء في بيانات الجلسات وربطها تلقائيًا بالواجهة إذا كانت متوفرة. سيكون المتغيّر $errors
نسخة من Illuminate\Support\MessageBag
. لمزيد من المعلومات حول العمل مع هذا الكائن راجع توثيقه.
ملاحظة: يرتبط المتغيّر errors$
بالواجهة عبر البرمجيّة الوسيطة Illuminate\View\Middleware\ShareErrorsFromSession
التي تُوفّرها مجموعة برمجيّات web
الوسيطة. عند تطبيق هذه البرمجيّة الوسيطة، سيصبح المتغيّر $errors
متاحًا دائمًا في واجهاتك مما يتيح لك افتراض أن المتغيّر $errors
مُعرّف دائمًا ويمكن استخدامه بأمان.
إذًا في مثالنا هذا سيُعاد توجيه المستخدم إلى تابع وحدة تحكّمنا create
عند فشل عملية التحقق مما يسمح لنا بعرض رسائل الخطأ في الواجهة:
<!-- /resources/views/post/create.blade.php -->
<h1>Create Post</h1>
@if ($errors->any())
<div class="alert alert-danger">
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<!-- Create Post Form -->
ملاحظة حول الحقول الاختيارية
يحتوي Laravel افتراضيًّا على البرمجيّتين الوسيطتين TrimStrings
و ConvertEmptyStringsToNull
في مكدّس برمجيّات تطبيقك الوسيطة العامة. تورد قائمة هذه البرمجيّات الوسيطة في المكدس من طرف الصنف App\Http\Kernel
. وبسبب هذا، ستحتاج غالبًا لوضع علامة على حقول طلبك "الاختيارية" كقيمة nullable
إن لم تُرد أن يعتبر المحقّق القيم null
غير صالحة. على سبيل المثال:
$request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
'publish_at' => 'nullable|date',
]);
نُحدّد في هذا المثال أن الحقل publish_at
يكون إما ذو قيمة null
أو تاريخ صالح. إن لم يُضف المُحدّد nullable
لتعريف القاعدة، سيعتبر المُدقّق القيمة null
غير صالحة.
طلبات وتحقّق AJAX
في هذا المثال استخدمنا نموذجًا تقليديًا لإرسال البيانات إلى التطبيق. ولكن العديد من التطبيقات تستخدم طلبات AJAX. عند استخدام التابع validate
أثناء طلب AJAX ، لن يُولّد Laravel استجابة إعادة توجيه. بدلاً من ذلك، يُولّد Laravel استجابة JSON تحتوي على جميع أخطاء التحقق من الصحة. ستُرسل هذه الاستجابة JSON برمز حالة HTTP 422.
التحقّق من صحّة طلب استمارة
إنشاء طلبات الاستمارة
قد ترغب في إنشاء "طلب استمارة" من أجل سيناريوهات التحقق الأكثر تعقيدًا. طلبات الاستمارات هي أصناف طلبات مخصّصة تحتوي على منطق التحقق من الصحة. لإنشاء صنف طلب استمارة، استخدم الأمر make:request
Artisan CLI:
php artisan make:request StoreBlogPost
سيوضع الصنف المُنشئ في المُجلّد app/Http/Requests
. إن لم يوجد هذا الدليل، سيُنشأ عند تنفيذ الأمر make:request
. فلنضف بعض قواعد التحقق إلى التابع rules
:
/**
* احصل على قواعد التحقق من الصحة التي تنطبق على الطلب.
*
* @return array
*/
public function rules()
{
return [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
];
}
ملاحظة: تستطيع كتابة أي تلميح على النوع تحتاج إليه ضمن توقيع التابع rules
. سيُستبان تلقائيًا عبر حاوي خدمات Laravel.
كيف إذن تُقيّم قواعد التحّقق؟ كل ما عليك فعله هو التلميح على نوع الطلب في تابع وحدة تحكّمك. يُتحقّق من صحّة طلب الاستمارة الوارد قبل مناداة تابع وحدة التحكّم ممّا يعني أنه لا حاجة لكركبة وحدة تحكّمك بأي منطق للتحقّق من الصحة:
/**
* تخزين منشور المدونة الوارد.
*
* @param StoreBlogPost $request
* @return Response
*/
public function store(StoreBlogPost $request)
{
// الطلب الوارد صالح...
// جلب بيانات الإدخال الصالحة ...
$validated = $request->validated();
}
في حالة فشل التحقّق من الصحّة، ستُولّد استجابة إعادة توجيه لإعادة إرسال المستخدم لموقعه السابق. كما ستُموّض (flash) الأخطاء للجلسة كي تكون متاحة للعرض. إن كان الطلب طلب AJAX، ستُردّ استجابة HTTP برمز الحالة 422 للمستخدم بما في ذلك تمثيل JSON لأخطاء التحقق من الصحة.
إضافة خطافات لاحقة إلى طلبات النموذج (Adding After Hooks To Form Requests)
إن رغبت في إضافة خطاف "لاحق" إلى طلب نموذج، تستطيع استخدام التابع withValidator
. يستقبل هذا التابع أداة التحقق المبنية بالكامل ممّا يسمح لك بمناداة أي من توابعها قبل تقييم قواعد التحقق من الصحة:
/**
* إعداد نسخة المُحقّق
*
* @param \Illuminate\Validation\Validator $validator
* @return void
*/
public function withValidator($validator)
{
$validator->after(function ($validator) {
if ($this->somethingElseIsInvalid()) {
$validator->errors()->add('field', 'Something is wrong with this field!');
}
});
}
تخويل طلبات الاستمارة (Authorizing Form Requests)
يحتوي صنف طلب الاستمارة أيضًا على التابع authorize
. تستطيع التحقق ضمن هذا التابع ما إذا امتلك المستخدم المصادق عليه فعلًا سلطة تحديث مورد معيّن. يمكنك على سبيل المثال، تحديد ما إذا كان المستخدم يملك بالفعل تعليق مدوّنة يحاول تحديثه:
/**
* حدد ما إذا كان المستخدم مخولًا لعمل هذا الطلب.
*
* @return bool
*/
public function authorize()
{
$comment = Comment::find($this->route('comment'));
return $comment && $this->user()->can('update', $comment);
}
نظرًا لأن جميع طلبات الاستمارات تُوسّع صنف طلب Laravel الأساسي، نستطيع استخدام التابع user
للوصول إلى المستخدم المصادق عليه حاليًا. لاحظ أيضًا مناداة التابع route
في المثال أعلاه. يمنحك هذا التابع إمكانيّة الوصول إلى معاملات URI المحدّدة في المسار المُنادى، مثل المعامل {comment}
في المثال التالي:
Route::post('comment/{comment}');
إن ردّ التابع authorize
القيمة false، ستُردّ استجابة HTTP مع رمز حالة 403 تلقائيًّا ولن يُنفّذ تابع وحدة تحكّمك.
إذا كنت تخطط لوضع منطق تخويل (authorization logic) في جزء آخر من تطبيقك، عليك رد القيمة true
من التابع authorize
:
/**
* حدد إذا كان المستخدم مخولًا لعمل هذا الطلب أو لا.
*
* @return bool
*/
public function authorize()
{
return true;
}
ملاحظة: تستطيع كتابة أي تلميح على النوع تحتاج إليه ضمن توقيع التابع authorize
. ستُستبان تلقائيًا عبر حاوي خدمات Laravel.
تخصيص رسائل الخطأ
يمكنك تخصيص رسائل الخطأ المستخدمة من طرف طلب الاستمارة عن طريق إعادة تعريف التابع messages
. يجب أن يردّ هذا التابع مصفوفة من أزواج خاصيّة / قاعدة ورسائل الخطأ المطابقة لها:
/**
* احصل على رسائل خطأ قواعد التحقق المُعرّفة .
*
* @return array
*/
public function messages()
{
return [
'title.required' => 'A title is required',
'body.required' => 'A message is required',
];
}
إنشاء مُتحقّقي الصحّة يدويًّا (Manually Creating Validators)
إن لم ترغب باستخدام التابع validate
في الطلب، تستطيع إنشاء نسخة من متحقّق الصحّة يدويًا باستخدام واجهة Validator الساكنة. يُولّد التابع make
في الواجهة الساكنة نسخة مُتحقّق جديدة:
<?php
namespace App\Http\Controllers;
use Validator;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class PostController extends Controller
{
/**
* تخزين مشاركة مدوّنة جديدة.
*
* @param Request $request
* @return Response
*/
public function store(Request $request)
{
$validator = Validator::make($request->all(), [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
if ($validator->fails()) {
return redirect('post/create')
->withErrors($validator)
->withInput();
}
// Store the blog post...
}
}
أوّل مُتغيّر وسيط يمرّر إلى التابع make
هو البيانات تحت التحقّق من الصحة. المتغيّر الوسيط الثاني هو قواعد التحقق التي يجب تطبيقها على البيانات.
بعد فحص فشل التحقّق من صحة الطلب، تستطيع استخدام التابع withErrors
لتمويض رسائل الخطأ للجلسة. عند استخدام هذا التابع، سيُشارك المتغيّر $errors
تلقائيًا مع واجهاتك بعد إعادة التوجيه ممّا يسمح لك بعرضها بسهولة على المستخدم. يقبل التابع withErrors
مُتحقّق و MessageBag
أو array (مصفوفة) PHP.
إعادة التوجيه التلقائيّة
إن رغبت في إنشاء نسخة مُتحقّق يدويًا مع الاستفادة من إعادة التوجيه التلقائية التي يقّدمها تابع الطلبات validate
، تستطيع مناداة التابع validate
على نسخة مُتحقّق موجودة. سيُعاد توجيه المستخدم تلقائيًا إذا فشل التحقق من الصحّة أو في حالة طلب AJAX ستُرد استجابة JSON:
Validator::make($request->all(), [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
])->validate();
حقائب الأخطاء المسمّاة (Named Error Bags)
قد ترغب في تسمية MessageBag
من الأخطاء إن امتلكت عدّة استمارات على صفحة واحدة، ممّا يسمح لك باسترداد رسائل الخطأ الخاصة باستمارة معيّنة. مرّر اسمًا ما كالمتغيّر الوسيط الثاني إلى withErrors
:
return redirect('register')
->withErrors($validator, 'login');
يمكنك بعدها الوصول إلى نسخة MessageBag
المسمّاة من المتغيّر errors$
:
{{ $errors->login->first('email') }}
خطاف التحقق من الصحة اللاحق (After Validation Hook)
يسمح لك المُتحقّق أيضًا بإرفاق ردود نداء للتشغيل بعد إكمال التحقق. يتيح لك هذا إجراء المزيد من التحقق بسهولة وإضافة المزيد من رسائل الخطأ لمجموعة الرسائل. استخدم التابع after
للبدء على نسخة مُتحقّق من الصحة:
$validator = Validator::make(...);
$validator->after(function ($validator) {
if ($this->somethingElseIsInvalid()) {
$validator->errors()->add('field', 'Something is wrong with this field!');
}
});
if ($validator->fails()) {
//
}
التعامل مع رسائل الخطأ
ستحصل، بعد مناداة التابع errors
على نسخة Validator
على نسخة Illuminate\Support\MessageBag
والتي تحتوي على مجموعة متنوّعة من التوابع الملائمة للعمل مع رسائل الخطأ. يمثّل أيضًا المتغيّر $errors
المتاح تلقائيًّا لجميع الواجهات نسخة من الصنف MessageBag
.
استرداد أول رسالة خطأ بالحقل (Retrieving The First Error Message For A Field)
استخدم التابع first
لاسترداد أول رسالة خطأ لحقل معيّن:
$errors = $validator->errors();
echo $errors->first('email');
استخدم التابع get
إن أردت استرداد مصفوفة تحتوي جميع رسائل حقل معين:
foreach ($errors->get('email') as $message) {
//
}
إن كنت تتحقق من حقل مصفوفة بالاستمارة، تستطيع استرداد جميع الرسائل لكل عنصر من عناصر المصفوفة على حدة باستخدام الحرف *
:
foreach ($errors->get('attachments.*') as $message) {
//
}
التحقق من وجود الرسائل بالحقل
يمكن استخدام التابع has
للتأكّد من وجود أي رسائل خطأ بحقل معيّن:
if ($errors->has('email')) {
//
}
رسائل الخطأ المخصّصة
تستطيع عند اللزوم استخدام رسائل خطأ مخصّصة للتحقق من الصحة بدلًا من الرسائل الافتراضية. توجد عدّة طرق لتحديد الرسائل المخصّصة. أولًا، تستطيع تمرير الرسائل المخصّصة كالمتغيّر الوسيط الثالث للتابع Validator::make
:
$messages = [
'required' => 'The :attribute field is required.',
];
$validator = Validator::make($input, $rules, $messages);
سيُستبدل في هذا المثال النص البديل (placeholder) المسمّى attribute: بالاسم الفعلي للحقل تحت التحقق. يمكنك أيضًا الاستفادة من النصوص البديلة (place-holder) الأخرى في رسائل التحقق من الصحة. على سبيل المثال:
$messages = [
'same' => 'The :attribute and :other must match.',
'size' => 'The :attribute must be exactly :size.',
'between' => 'The :attribute value :input is not between :min - :max.',
'in' => 'The :attribute must be one of the following types: :values',
];
تحديد رسالة مخصّصة لخاصيّة معيّنة
قد ترغب أحيانًا في تحديد رسائل خطأ مخصّصة لحقل معيّن فقط. تستطيع استخدام التدوين "نقطة". حدّد أولًا اسم الخاصيّة، متبوعًا بالقاعدة:
$messages = [
'email.required' => 'We need to know your e-mail address!',
];
تحديد الرسائل المخصّصة في ملفات اللغة
في معظم الحالات، ستُحدّد غالبًا رسائلك المخصّصة في ملف لغة بدلًا من تمريرها مباشرة إلى المتحقّق Validator
. أضف رسائلك إلى المصفوفة custom
في ملف اللغة resources/lang/xx/validation.php
.
'custom' => [
'email' => [
'required' => 'We need to know your e-mail address!',
],
],
تحديد خاصيّات مخصّصة في ملفات اللغة
إن رغبت في استبدال الجزء attribute:
من رسالة تحقّقك باسم خاصيّة مخصصة تستطيع تحديد الاسم المخصص في المصفوفة attributes
لملف لغتك resources/lang/xx/validation.php
:
'attributes' => [
'email' => 'email address',
],
قواعد التحقّق المتاحة
تجد أدناه قائمة بجميع قواعد التحقق المُتوفّرة ووظيفتها:
Accepted
Active URL
(After (Date
(After Or Equal (Date
Alpha
Alpha Dash
Alpha Numeric
Array
Bail
(Before (Date
(Before Or Equal (Date
Between
Boolean
Confirmed
Date
Date Equals
Date Format
Different Digits
Digits Between
(Dimensions (Image Files
Distinct E-Mail
(Exists (Database
File
Filled
Greater Than
Greater Than Or Equal
(Image (File
In
In Array
Integer
IP Address
JSON
Less Than
Less Than Or Equal
Max
MIME Types
MIME Type By File Extension
Min
Not In
Not Regex
Nullable
Numeric
Present
Regular Expression
Required
Required If
Required Unless
Required With
Required With All
Required Without
Required Without All
Same
Size
String
Timezone
(Unique (Database
URL
accepted
يجب أن تكون قيمة الحقل قيد التحقّق yes ،on ،1، أو true
. يفيد ذلك في التحقق من قبول "شروط الخدمة".
Active_url
يجب على الحقل قيد التحقّق أن يكون تسجيلًا A أو AAAA حسب التابع dns_get_record
PHP.
After:date
يجب أن تكون قيمة الحقل تحت التحقّق بعد تاريخ معيّن. ستُمرّر التواريخ إلى الدالّة strtotime
PHP:
'start_date' => 'required|date|after:tomorrow'
تستطيع تحديد حقل آخر لتقارن التاريخ معه بدلًا من تمرير سلسلة تاريخ لتقيّمها strtotime
:
'finish_date' => 'required|date|after:start_date'
After_or_equal:date
يجب أن تكون قيمة الحقل تحت التحقق لاحقة أو مُساوية للتاريخ المحدّد. راجع القاعدة After لمزيد من المعلومات.
Alpha
يجب أن يكون محتوى الحقل تحت التحقق أبجديًّا بالكامل.
Alpha_dash
يمكن للحقل تحت التحقّق أن يحتوي على حروف أبجديّة أو رقميّة (alphanumeric) إضافةً إلى شرطات (dashes) وشرطات سفلية (underscore).
Alpha_num
يجب أن يتكّون محتوى الحقل تحت التحقق من أحرف أبجديّة ورقميّة.
Array
يجب أن يكون الحقل تحت التحقق مصفوفة PHP array
.
bail
إيقاف العمل بقواعد التحقق من الصحّة بعد فشل التحقّق الأوّل.
before:date
يجب أن تكون قيمة الحقل تحت التحقّق سابقة للتاريخ المحدّد. ستُمرّر التواريخ للدالّة strtotime
PHP.
before_or_equal:date
يجب أن تكون قيمة الحقل تحت التحقّق سابقة أو مساوية للتاريخ المحدّد. ستُمرّر التواريخ للدالّة strtotime
PHP.
between:min,max
يجب أن يكون حجم الحقل تحت التحقق بين الحدّين الأدنى min والأقصى max. تقيّم السلاسل النصيّة والقيم العدديّة (numerics) والمصفوفات والملفات حسب نفس القاعدة size.
boolean
يجب أن يكون ممكنًا وضع قيمة منطقيّة (boolean) بالحقل تحت التحقّق. الإدخالات المقبولة هي true
و false
و 1
و 0
و "1
" و "0
".
Confirmed
يجب أن يكون للحقل تحت التحقق حقل مطابق foo_confirmation
. إذا كان الحقل تحت التحقق كلمة سر password
مثلا، يجب أن يوجد حقل مطابق password_confirmation
في الإدخالات.
date
يجب أن يكون الحقل تحت التحقق تاريخًا صالحًا وفقًا للدالّة strtotime
PHP.
date_equals:date
يجب أن تساوي قيمة الحقل تحت التحقق للتاريخ المحدّد. ستُمرّر التواريخ للدالّة strtotime
PHP.
date_format:format
يجب أن يطابق تنسيق الحقل تحت التحقّق التنسيق المحدد. عليك استخدام إما date
أو date_format
عند التحقق من صحة الحقل لا كليهما.
different:field
يجب أن تكون قيمة الحقل تحت التحقق مختلفة عن field
.
digits:value
يجب أن تكون قيمة الحقل تحت التحقق رقميّة (numeric) ويجب أن يكون طولها value
.
digits_between:min,max
يجب أن يكون طول الحقل تحت التحقق بين الحدّين الأدنى min والأقصى max المحدّدين.
dimensions
يجب أن يكون الملف تحت التحقّق صورة تلتزم بقيود الأبعاد المُحدّدة بمعاملات القاعدة:
'avatar' => 'dimensions:min_width=100,min_height=200'
القيود المتاحة هي: min_width
،max_width
،min_height
،max_height
،width
،height
،ratio
.
يجب تمثيل قيد النسبة (ratio
) كالعرض مقسومًا على الطول. يمكن تحديد هذا إمّا بكسر مثل 3/2
أو عدد عشري (float) مثل 1.5
:
'avatar' => 'dimensions:ratio=3/2'
تستطيع استخدام التابع Rule::dimensions
بما أنّ هذه القاعدة تتطلّب عدّة متغيّرات وسيطة لبنائها بسلاسة:
use Illuminate\Validation\Rule;
Validator::make($data, [
'avatar' => [
'required',
Rule::dimensions()->maxWidth(1000)->maxHeight(500)->ratio(3 / 2),
],
]);
distinct
يجب أن يخلو الحقل تحت التحقق من أي قيم مكررة عند العمل بالمصفوفات.
'foo.*.id' => 'distinct'
email
يجب تنسيق الحقل تحت التحقّق كعنوان بريد إلكتروني.
Exists:table,column
يجب أن يوجد الحقل تحت التحقّق في جدول قاعدة بيانات المحدّد.
الاستخدام الأساسي للقاعدة Exists
'state' => 'exists:states'
إن لم يُحدّد الخيار column
سيُستخدام اسم الحقل.
تحديد اسم عمود مخصص
'state' => 'exists:states,abbreviation'
قد تحتاج من حين لآخر لتحديد اتصال قاعدة بيانات محدّد لاستخدامه في الاستعلام exists
. تستطيع تحقيق ذلك عن طريق إضافة اسم الاتصال لاسم الجدول باستخدام التنقيط "نقطة":
'email' => 'exists:connection.staff,email'
تستطيع إن رغبت في تخصيص الاستعلام الذي تنفذّه قاعدة التحقّق استخدام الصنف Rule
لتعريف القاعدة بسلاسة. سنحدد أيضًا في هذا المثال قواعد التحقّق من الصحّة في مصفوفة بدلًا من استخدام الحرف | لتحديدها:
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::exists('staff')->where(function ($query) {
$query->where('account_id', 1);
}),
],
]);
file
يجب أن يكون الحقل تحت التحقق ملفًا محمّلًا بنجاح.
filled
يجب ألّا يكون الحقل تحت التحقق فارغًا إن وُجد.
gt:field
يجب أن يكون الحقل تحت التحقّق أكبر من الحقل المحدّد field
. يجب أن يكون الحقلان من نفس النوع. تُقيّم السلاسل النصيّة، والقيم العدديّة، والمصفوفات، والملفات حسب نفس القاعدة size
.
Gte:field
يجب أن يكون الحقل تحت التحقق من الصحّة أكبر أو مساوي للحقل المحدّد field
. يجب أن يكون الحقلان من نفس النوع. تُقيّم السلاسل النصيّة، والقيم العدديّة، والمصفوفات، والملفات حسب نفس القاعدة size
.
image
يجب أن يكون الحقل تحت التحقق صورة (jpeg أو png أو bmp أو gif أو svg).
..,in:foo,bar
يجب تضمين الحقل تحت التحقق من الصحة في قائمة القيم المحدّدة. وبما أنّ هذه القاعدة تتطلب منك غالبًا أن تستخدم التابع implode
على المصفوفة (يجمِع التابع implode
عناصر مصفوفة لتشكِّل سلسلةً نصيةً)، تستطيع استخدام التابع Rule::in
لإنشاء القاعدة بسلاسة:
use Illuminate\Validation\Rule;
Validator::make($data, [
'zones' => [
'required',
Rule::in(['first-zone', 'second-zone']),
],
]);
in_array:anotherfield
يجب أن يوجد محتوى الحقل تحت التحقق ضمن قيم حقل آخر anotherfield
.
integer
يجب أن يكون الحقل تحت التحقق عددًا صحيحًا طبيعيًّا.
ip
يجب أن يكون الحقل تحت التحقّق عنوان IP.
ipv4
يجب أن يكون الحقل تحت التحقق من الصحة عنوان IPv4.
ipv6
يجب أن يكون الحقل تحت التحقق من الصحة عنوان IPv6.
json
يجب أن يكون الحقل تحت التحقّق سلسلة JSON صالحة.
lt:field
يجب أن تكون قيمة الحقل تحت التحقق أصغر من قيمة الحقل المحدّد field
. يجب أن يكون الحقلان من نفس النوع. تُقيّم السلاسل النصيّة، والقيم العدديّة، والمصفوفات، والملفات حسب نفس القاعدة size
.
lte:field
يجب أن تكون قيمة الحقل تحت التحقق أقل أو مساوية لقيمة الحقل المحدّد field
. يجب أن يكون الحقلان من نفس النوع. تُقيّم السلاسل النصيّة، والقيم العدديّة، والمصفوفات، والملفات حسب نفس القاعدة size
.
max:value
يجب أن تكون قيمة الحقل تحت التحقق أقل من القيمة المحدّدة value. تُقيّم السلاسل النصيّة، والقيم العدديّة، والمصفوفات، والملفات حسب نفس القاعدة size
.
...,mimetypes:text/plain
يجب أن يُطابق الملف تحت التحقق أحد الأنواع MIME المحدّدة:
'video' => 'mimetypes:video/avi,video/mpeg,video/quicktime'
لتحديد النوع MIME للملف المُحمّل، ستُقرأ محتويات الملف وسيحاول الإطار تخمين النوع MIME والذي قد يكون مختلفًا عن نوع MIME الذي قدّمه العميل.
...,mimes:foo,bar
يجب أن يحتوي الملف تحت التحقّق على نوع MIME يتوافق مع إحدى الإضافات المدرجة.
الاستخدام الأساسي للقاعدة MIME
'photo' => 'mimes:jpeg,bmp,png'
تتحقق هذه القاعدة بالفعل من نوع MIME للملف بقراءة محتوياته ثم تخمين النوع MIME رغم أنك تحتاج فقط لتحديد الامتدادات.
يمكن العثور على قائمة كاملة لأنواع MIME وامتداداتها المقابلة في الموقع التالي:https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
Min:value
يجب أن يكون للحقل تحت التحقق حد قيمة أدنى value. تُقيّم السلاسل النصيّة، والقيم العدديّة، والمصفوفات، والملفات حسب نفس القاعدة size
.
...,not_in:foo,bar
يجب ألّا يوجد الحقل تحت التحقق في قائمة القيم المحددة. يمكن استخدام التابع Rule::notIn
:
use Illuminate\Validation\Rule;
Validator::make($data, [
'toppings' => [
'required',
Rule::notIn(['sprinkles', 'cherries']),
],
]);
not_regex:pattern
يجب ألّا يطابق الحقل تحت التحقّق التعبير النمطي (regular expression) المحدّد.
ملاحظة: عند استخدام الأنماط regex
/ not_regex
، قد يكون تحديد القواعد في مصفوفة بدلًا من استخدام محددات أشرطة عموديّة (pipe delimiters أي "|") ضروريًّا، خاصة إذا كان التعبير النمطي يحتوي على خط عمودي (pipe character).
nullable
يمكن أن يكون الحقل تحت التحقّق ذا قيمة فارغة null
. نرى فائدة هذه القاعدة خاصة عند التحقق من صحة بيانات بدائيّة (primitive) مثل السلاسل النصيّة والأعداد الصحيحة الطبيعيّة التي قد تحتوي على قيم null
.
numeric
يجب أن يكون الحقل تحت التحقّق عدديّا.
present
يجب أن يوجد الحقل تحت التحقّق في بيانات الإدخال لكن يمكن أن يظل فارغًا.
regex:pattern
يجب أن يطابق الحقل تحت التحقّق التعبير النمطي (regular expression) المحدّد.
ملاحظة: عند استخدام الأنماط regex
/ not_regex
قد يكون تحديد القواعد في مصفوفة بدلاً من استخدام محددات أشرطة عموديّة (pipe delimiters أي "|") ضروريًّا، خاصة إذا كان التعبير العادي يحتوي على خط عمودي (pipe character).
Required
يجب أن يوجد الحقل تحت التحقق في بيانات الإدخال وألّا يكون فارغًا. يعتبر الحقل "فارغًا" إن تحقّقت أحد الشروط التالية:
- القيمة
null
.
- القيمة سلسلة نصيّة فارغة.
- القيمة مصفوفة فارغة أو كائن
Countable
فارغ.
- القيمة ملف مُحمّل بدون مسار.
...,Required_if:anotherfield,value
يجب أن يوجد الحقل تحت التحقق وأن لا يكون فارغًا إذا ساوى الحقل anotherfield
أيّ قيمة value.
...,required_unless:anotherfield,value
يجب أن يوجد الحقل تحت التحقق وأن لا يكون فارغًا إلّا إذا لم يوجد الحقل anotherfield
أيّ قيمة value.
...,required_with:foo,bar
يجب أن يوجد الحقل تحت التحقق وأن لا يكون فارغًا فقط إن وُجد أي من الحقول الأخرى المُحدّدة.
...,required_with_all:foo,bar
يجب أن يوجد الحقل تحت التحقق وأن لا يكون فارغًا فقط إن وُجدت كل الحقول الأخرى المُحدّدة.
...,required_without:foo,bar
يجب أن يوجد الحقل تحت التحقق وأن لا يكون فارغًا فقط إن لم يوجد أي من الحقول الأخرى المُحدّدة.
...,required_without_all:foo,bar
يجب أن يوجد الحقل تحت التحقق وأن لا يكون فارغًا فقط إن لم توجد كل الحقول الأخرى المُحدّدة.
same:field
يجب أن يطابق الحقل المُحدّد الحقل تحت التحقّق.
size:value
يجب أن يطابق حجم الحقل تحت التحقق القيمة المحددة. تعني القيمة بالنسبة للبيانات النصيّةعدد الأحرف. القيمة هي القيمة العدديّة المحدّدة بالنسبة للبيانات الرقمية. بالنسبة للمصفوفة، الحجم يُوافق count المصفوفة. بالنسبة للملفات، الحجم هو حجم الملف بالكيلوبايت.
string
يجب أن يكون الحقل تحت التحقق سلسلة نصيّة. إن رغبت في السماح للحقل بأن يكون أيضًا null
، عن القاعدة nullable
على الحقل.
timezone
يجب أن يكون الحقل ضمن التحقق مُعرّف منطقة زمنيّة صالحا وفقًا للدالّة timezone_identifiers_list
PHP.
unique:table,column,except,idColumn
يجب أن يكون الحقل تحت التحقق فريدًا في جدول قاعدة بيانات محدّد. فسيُستخدم اسم الحقل إن لم يُحدّد الخيار column
.
تحديد اسم عمود مخصص
'email' => 'unique:users,email_address'
اتصال قاعدة البيانات المخصّص (Custom Database Connection)
قد تحتاج من حين لآخر لتعيين اتصال مخصّص لاستعلامات قاعدة البيانات التي يُجريها المُتحقّق. سيستخدم إعداد unique:users
كقاعدة تحقّق من الصحّة كما رأينا أعلاه اتصال قاعدة البيانات الافتراضي للاستعلام عن قاعدة البيانات. لإعادة تعريف هذا الإعداد، حدّد الاتصال واسم الجدول باستخدام التنقيط "نقطة":
'email' => 'unique:connection.users,email_address'
إجبار قاعدة فريدة على تجاهل معرّف (ID) معيّن
قد ترغب أحيانًا في تجاهل معرّف معيّن أثناء الفحص الفريد. افترض مثلًا شاشة "تحديث الملف الشخصي" والتي تتضمّن اسم المستخدم وعنوان البريد الإلكتروني والموقع. ستحتاج طبعا للتحقق من فرادة عنوان البريد الإلكتروني. ولكن لن ترغب طرح خطأ إن غيّر المستخدم حقل الاسم فقط لا حقل البريد الإلكتروني لأن المستخدم يمتلك بالفعل عنوان البريد الإلكتروني.
لإعطاء المُتحقّق تعليمات تجاهل معرّف المستخدم (ID)، نستخدم الصنف Rule
لتعريف القاعدة بسلاسة. سنحدّد في هذا المثال أيضًا قواعد التحقّق من الصحّة في مصفوفة بدلًا من استخدام الحرف |
للفصل بين القواعد:
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::unique('users')->ignore($user->id),
],
]);
تستطيع إن استخدم جدولك اسم عمود مفتاح أوّلي غير id
تحديد اسم العمود عند مناداة التابع ignore
:
'email' => Rule::unique('users')->ignore($user->id, 'user_id')
إضافة شروط Where أخرى (Adding Additional Where Clauses):
تستطيع أيضًا تحديد قيود استعلام إضافية بتخصيص الاستعلام باستخدام التابع where
. فلنضف على سبيل المثال قيدًا يتحقّق من أن account_id
يساوي 1
:
'email' => Rule::unique('users')->where(function ($query) {
return $query->where('account_id', 1);
})
url
يجب أن يكون الحقل تحت التحقّق عنوان URL
صالح.
إضافة القواعد المشروطة
التحقّق من الصحّة عند الحضور
قد ترغب في بعض الحالات بتشغيل التحقّق من صحّة حقل فقط إذا كان هذا الحقل موجودًا في مصفوفة الإدخال. أضف القاعدة sometimes
إلى قائمة قواعدك لإتمام هذا بسرعة:
$v = Validator::make($data, [
'email' => 'sometimes|required|email',
]);
في المثال أعلاه ، لن يُقبل الحقل email
إلا إن وجد في المصفوفة data$
.
ملاحظة: إذا كنت تحاول التحقق من صحّة حقل واجب الوجود لكن مع احتمال كونه فارغًا فراجع هذه الملاحظة في الحقول الاختيارية.
التحقق المشروط المعقّد (Complex Conditional Validation)
قد ترغب أحيانًا في إضافة قواعد تحقّق استنادًا على منطق شرطي أكثر تعقيدًا. قد ترغب على سبيل المثال في اشتراط حقل محدّد فقط إن امتلك حقل آخر قيمة أكبر من 100. أو قد تحتاج لامتلاك حقلين ذوي قيمة معيّنة فقط عند وجود حقل آخر. يجب أن تكون إضافة هذه القواعد سهلة. أولاً، أنشئ نسخة Validator
بقواعدتك الثابتة التي لا تتغير أبدًا:
$v = Validator::make($data, [
'email' => 'required|email',
'games' => 'required|numeric',
]);
لنفترض أن تطبيقنا الويب مخصّص لهواة جمع الألعاب. إن سجّل جامع ألعاب نفسه بتطبيقنا وامتلك أكثر من 100 لعبة سنرغب بأن يشرح لنا سبب امتلاكه هذا العدد الكبير من الألعاب. ربما مثلًا يديرون متجرًا لبيع الألعاب أو لربما يستمتعون بالتجميع فقط. يمكننا استخدام التابع sometimes
لإضافة هذا الشرط بشكل شرطي في النسخة Validator
.
$v->sometimes('reason', 'required|max:500', function ($input) {
return $input->games >= 100;
});
يمثّل المتغيّر الوسيط الأوّل المُمرّر إلى التابع sometimes
اسم الحقل الذي نتحقّق منه شرطيًّا. المتغيّر الوسيط الثاني هو القواعد التي نود إضافتها. إذا ردّ Closure
المُمرّر كالمتغيّر الثالث القيمة true
ستُضاف القواعد. تجعل هذه الطريقة بناء عمليات التحقق الشرطية المعقدة سهلة جدّا. يمكنك حتى إضافة عمليات تحقّق شرطي لعدّة حقول في المرّة:
$v->sometimes(['reason', 'cost'], 'required', function ($input) {
return $input->games >= 100;
});
ملاحظة: ستكون المعاملة $input
المُمرّرة إلى Closure
نسخة من Illuminate\Support\Fluent
ويمكن استخدامها للوصول إلى إدخالاتك وملفّاتك.
التحقق من المصفوفات
لا يجب أن يكون التحقق من صحّة حقول الإدخال المصفوفة صعبًا. تستطيع استخدام "النقطة" للتحقق من صحة الخاصيّات داخل المصفوفة. تستطيع إن احتوى الطلب HTTP الوارد مثلًا على حقل photos[profile]
التحقق من صحته كما يلي:
$validator = Validator::make($request->all(), [
'photos.profile' => 'required|image',
]);
تستطيع أيضًا التحقق من صحّة كل عنصر في المصفوفة على حدة. تستطيع مثلًا التحقق من فرادة كل بريد إلكتروني في حقل إدخال مصفوفة كما يلي:
$validator = Validator::make($request->all(), [
'person.*.email' => 'email|unique:users',
'person.*.first_name' => 'required_with:person.*.last_name',
]);
تستطيع أيضًا استخدام الحرف *
عند تحديد رسائل تحقّقك في ملفات لغتك، ممّا يُسهّل استخدام رسالة تحقّق واحدة للحقول المستندة على مصفوفة:
'custom' => [
'person.*.email' => [
'unique' => 'Each person must have a unique e-mail address',
]
],
قواعد التحقق المخصص
استخدام كائنات القاعدة
يوفر Laravel مجموعة متنوعة من قواعد التحقق المفيدة؛ قد ترغب مع ذلك في تحديد بعض قواعدك الخاصّة. استخدام كائنات القاعدة هي إحدى طرق تسجيل قواعد التحقق المخصّصة. تستطيع استخدام الأمر make:rule
Artisan لتوليد كائن قاعدة جديد. فلنستخدم هذا الأمر لتوليد قاعدة تتحقّق من كون حروف سلسلة نصيّة كبيرة. سيضع Laravel القاعدة الجديدة في المُجلّد app/Rules
:
php artisan make:rule Uppercase
نحن مستعدون لتعريف سلوك القاعدة بمجرد إنشائها. يحتوي كائن القاعدة على تابعين: passes
و message
. يتلقى التابع passes
قيمة الخاصيّة واسمها يجب أن يردّ القيمة true
أو القيمة false
استنادًا على صلاحيّة قيمة الخاصيّة. يجب أن يرد التابع message
رسالة خطأ التحقق التي يجب استخدامها عند فشل التحقق من الصحّة:
<?php
namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;
class Uppercase implements Rule
{
/**
* تحديد إذا مرّت قاعدة التحقق أم لا.
*
* @param string $attribute
* @param mixed $value
* @return bool
*/
public function passes($attribute, $value)
{
return strtoupper($value) === $value;
}
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return 'The :attribute must be uppercase.';
}
}
تستطيع طبعًا مناداة المساعد trans
من تابعك message
إذا رغبت في رد رسالة خطأ من ملفات ترجمتك:
/**
* Get the validation error message.
*
* @return string
*/
public function message()
{
return trans('validation.uppercase');
}
تستطيع إرفاق القاعدة بعد تعريفها بمُتحقّق عبر تمرير نسخة من كائن القاعدة مع قواعد تحقّقك الأخرى:
use App\Rules\Uppercase;
$request->validate([
'name' => ['required', 'string', new Uppercase],
]);
استخدام Closures
تستطيع إن احتجت لوظيفة (functionality) القاعدة المخصّصة مرة واحدة فقط في التطبيق استخدام Closure بدلًا من كائن القاعدة. يتلقى Closure اسم الخاصيّة وقيمة الخاصيّة وردّ نداء fail$
يجب مناداته في حالة فشل التحقق من الصحّة:
$validator = Validator::make($request->all(), [
'title' => [
'required',
'max:255',
function($attribute, $value, $fail) {
if ($value === 'foo') {
return $fail($attribute.' is invalid.');
}
},
],
]);
استخدام الإضافات
توجد طريقة أخرى لتسجيل قواعد التحقق المخصّصة وهي استخدام التابع extend
على الواجهة الساكنة Validator
. فلنستخدم هذا التابع داخل موفّر الخدمات لتسجيل قاعدة تحقّق مخصّصة:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;
class AppServiceProvider extends ServiceProvider
{
/**
* مهّد أي خدمات التطبيق.
*
* @return void
*/
public function boot()
{
Validator::extend('foo', function ($attribute, $value, $parameters, $validator) {
return $value == 'foo';
});
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
}
تستطيع أيضًا تمرير صنف وتابع للتابع extend
بدلًا من Closure:
Validator::extend('foo', 'FooValidator@validate');
تعريف رسالة الخطأ
ستحتاج أيضًا لتعريف رسالة خطأ لقاعدتك المخصّصة. يمكنك ذلك إما باستخدام مصفوفة رسائل مخصصة مباشرة (inline) أو بإضافة مدخل في ملف لغة التحقّق. يجب وضع هذه الرسالة في أول مستوى من المصفوفة لا ضمن المصفوفة custom
فهي مجعولة لرسائل خطأ الخاصيّات فقط:
"foo" => "Your input was invalid!",
"accepted" => "The :attribute must be accepted.",
// باقي رسائل أخطاء التحقق من الصحة ...
قد تحتاج أحيانًا عند إنشاء قاعدة تحقّق مخصّصة لتعريف بدائل () مخصّصة لرسائل الخطأ. يمكنك ذلك عبر إنشاء متحقّق مخصّص كما هو موضح أعلاه ثم مناداة التابع replacer
على الواجهة الساكنة Validator
. تستطيع ذلك بفضل التابع boot
موفّر الخدمات:
/**
* مهّد أي خدمات التطبيق.
*
* @return void
*/
public function boot()
{
Validator::extend(...);
Validator::replacer('foo', function ($message, $attribute, $rule, $parameters) {
return str_replace(...);
});
}
الإضافات الضمنية (Implicit Extensions)
عند التحقق من خاصيّة غير موجودة أو تحتوي على قيمة فارغة، كما حُدّد في القاعدة required
، لا تُشغّل قواعد التحقّق العادية بما في ذلك الملحقات المخصّصة. لن تُشغّل القاعدة unique
على قيمة null
:
$rules = ['name' => 'unique'];
$input = ['name' => null];
Validator::make($input, $rules)->passes(); // true
كي تشغّل القاعدة حتى عند خلّو إحدى الخاصيّات، على القاعدة أن تشير ضمنيًّا (imply) لكونها مطلوبة. لإنشاء مثل هذا الامتداد "الضمني"، استخدم التابع ()Validator::extendImplicit
:
Validator::extendImplicit('foo', function ($attribute, $value, $parameters, $validator) {
return $value == 'foo';
});
ملاحظة: كل ما تفعله الملحقة "الضمنية" هو الإشارة لكون الخاصيّة مطلوبة. أنت من يقرر بعدها بطلان الخاصيّة المفقودة أو الفارغة.