التحقق من الصحة هو سمة لنماذج Laravel Eloquent التي تضمن أن النماذج تلبي معايير التحقق الخاصة بها قبل حفظها. إذا لم يتم اعتبارها صالحة، فلن يتم حفظ النموذج وستكون أخطاء التحقق متاحة.
يسمح التحقق من الصحة بمجموعات قواعد متعددة، وإدخال معرف النموذج في قواعد التحقق unique
ورفع الاستثناءات في عمليات التحقق الفاشلة. إنها صغيرة الحجم ومرنة لتناسب سير عملك وتساعدك على حفظ البيانات الصالحة فقط.
هل تتطلع إلى استخدام التحقق من الصحة على Laravel 4.2+؟ قم بإلقاء نظرة على فرع 0.10.x للحصول على الوثائق وتعليمات التثبيت.
يعد إصدار Laravel 4.2 أكثر ملاءمة للتحقق من صحة النماذج؛ وهو يدعم رسائل التحقق المخصصة وقواعد التأكيد ومجموعات القواعد المتعددة. نظرًا لأن Laravel 5.0 يحتوي على التحقق من صحة FormRequest
، فقد تم تصميم التحقق من الصحة الآن للحفاظ على بياناتك الأساسية صالحة وترك التحقق من صحة النموذج لإطار العمل.
هل تتطلع إلى استخدام التحقق من الصحة على Laravel 5.0 إلى 5.2؟ قم بإلقاء نظرة على فرع 2.x للحصول على الوثائق وتعليمات التثبيت.
استخدم الإصدار Laravel 5.0 - 5.2 عقد ValidationException
الذي تم إهماله منذ ذلك الحين من إطار عمل Laravel. بالنسبة إلى Laravel 5.3، نقوم الآن بتوسيع التحقق الأساسي ValidationException
مما يعني أن إطار العمل سيعيد التوجيه تلقائيًا مرة أخرى مع وجود أخطاء عند حدوث خطأ في التحقق، مثلما يحدث FormRequest
.
واصل القراءة - هذه التعليمات مخصصة لك!
ما عليك سوى الانتقال إلى دليل المشروع الخاص بك حيث يوجد ملف composer.json
واكتب:
يتطلب الملحن واتسون/التحقق من الصحة
عرض تعليمات التثبيت لـ Laravel 4.2+. عرض تعليمات التثبيت لـ Laravel 5.0 - 5.2.
أولاً، أضف السمة إلى النموذج الخاص بك وأضف قواعد ورسائل التحقق من الصحة حسب الحاجة.
استخدم WatsonValidatingValidatingTrait؛class Post يمتد Eloquent { استخدم ValidatingTrait؛ قواعد $ محمية = [ 'العنوان' => 'مطلوب', 'slug' => 'مطلوب|فريد: المشاركات,slug', 'content' => 'مطلوب' ]; }
يمكنك أيضًا إضافة السمة إلى BaseModel
إذا كنت تستخدم واحدة وستعمل على جميع النماذج الممتدة منه، وإلا يمكنك فقط تمديد WatsonValidatingValidatingModel
بدلاً من Eloquent
.
ملاحظة: ستحتاج إلى تعيين خاصية $rules
على أي نماذج تمتد من BaseModel
الذي يستخدم السمة، أو تعيين مصفوفة فارغة $rules
لـ BaseModel
. إذا لم تقم بذلك، فسوف ينتهي بك الأمر حتمًا إلى LogicException with message 'Relationship method must return an object of type IlluminateDatabaseEloquentRelationsRelation'
.
الآن، يمكنك الوصول إلى بعض الوظائف الممتعة.
// تحقق مما إذا كان النموذج صالحًا أم لا.$post->isValid(); // صحيح// أو تحقق مما إذا كان غير صالح أم لا.$post->isInvalid(); // خطأ// بمجرد تحديد صلاحية النموذج،// يمكنك الحصول على الأخطاء.$post->getErrors(); // أخطاء messageBag
يصبح التحقق من صحة النموذج أمرًا بسيطًا أيضًا.
إذا ( ! $post->save()) {// Oops.return redirect()->route('posts.create') ->مع الأخطاء($post->getErrors()) ->withInput(); }return redirect()->route('posts.show', $post->id) ->withSuccess("تم حفظ مشاركتك بنجاح.");
بخلاف ذلك، إذا كنت تفضل استخدام الاستثناءات عند التحقق من صحة النماذج، فيمكنك استخدام التابع saveOrFail()
. الآن، سيتم ظهور استثناء عند محاولة حفظ نموذج غير صالح.
$post->saveOrFail();
لا تحتاج إلى التقاط الاستثناء ، إذا كنت لا تريد ذلك. يعرف Laravel كيفية التعامل مع ValidationException
وسيقوم بإعادة التوجيه تلقائيًا مرة أخرى مع إدخال النموذج والأخطاء. إذا كنت تريد التعامل مع الأمر بنفسك رغم ذلك.
حاول {$post->saveOrFail(); } قبض على (WatsonValidatingValidationException $e) {$errors = $e->getErrors();return redirect()->route('posts.create') ->مع الأخطاء(أخطاء $) ->withInput(); }
لاحظ أنه يمكنك فقط تمرير الاستثناء إلى التابع withErrors()
مثل withErrors($e)
وسيعرف Laravel كيفية التعامل معه.
إذا كنت تستخدم النموذج وترغب في إجراء عملية حفظ تتجاوز التحقق من الصحة، فيمكنك ذلك. سيعيد هذا نفس النتيجة كما لو قمت باستدعاء save()
على نموذج لا يحتوي على السمة.
$post->forceSave();
إذا كنت تفضل طرح الاستثناءات بشكل افتراضي عند استخدام طريقة save()
بدلاً من الاضطرار إلى استخدام saveOrFail()
يمكنك فقط تعيين الخاصية التالية على النموذج أو BaseModel
الخاص بك.
/** * ما إذا كان يجب على النموذج طرح ValidationException إذا * فشل في التحقق من الصحة. إذا لم يتم تعيينه، فسيتم تعيينه افتراضيًا على خطأ. * * @var boolean */protected $throwValidationExceptions = true;
إذا كنت ترغب في إجراء عملية حفظ لمرة واحدة باستخدام الاستثناءات أو القيم المرجعة، فيمكنك استخدام التابعين saveOrFail()
و saveOrReturn
.
لإظهار رسائل خطأ التحقق المخصصة، ما عليك سوى إضافة خاصية $validationMessages
إلى النموذج الخاص بك.
/** * سيتم تمرير رسائل التحقق إلى المدقق. * * @var array */protected $validationMessages = ['slug.unique' => "هناك منشور آخر يستخدم هذا الارتباط بالفعل."];
ربما لاحظت أننا نستخدم القاعدة unique
على السلسلة الثابتة، والتي لن تعمل إذا كنا نقوم بتحديث نموذج ثابت. لحسن الحظ، ستتولى عملية التحقق من الصحة هذا الأمر نيابةً عنك وتضيف المفتاح الأساسي للنموذج إلى القاعدة بحيث تعمل القاعدة كما هو متوقع؛ تجاهل النموذج الحالي.
يمكنك ضبط هذه الوظيفة عن طريق تعيين الخاصية $injectUniqueIdentifier
في النموذج الخاص بك.
/** * ما إذا كان يجب على النموذج إدخال معرفه في قواعد التحقق الفريدة * قبل محاولة التحقق من الصحة. إذا لم يتم تعيين هذه الخاصية * في النموذج، فستكون القيمة الافتراضية صحيحة. * * @var boolean */protected $injectUniqueIdentifier = true;
خارج الصندوق، نحن ندعم قاعدة Laravel unique
المقدمة. نحن ندعم أيضًا قاعدة felixkiss/uniquewith-validator الشائعة، ولكنك ستحتاج إلى الاشتراك فيها. ما عليك سوى إضافة use WatsonValidatingInjectorsUniqueWithInjector
بعد استيراد سمة التحقق من الصحة.
من السهل أيضًا دعم قواعد الحقن الإضافية، إذا أردت ذلك. لنفترض أنك تريد دعم قاعدة إضافية تسمى unique_ids
والتي تأخذ ببساطة المفتاح الأساسي للنموذج (لأي سبب كان). كل ما عليك فعله هو إضافة قاعدة الجمل التي تقبل أي معلمات موجودة واسم الحقل، وتقوم بإرجاع قاعدة الاستبدال.
/** * قم بإعداد قاعدة Unique_ids، مع إضافة معرف النموذج إذا لزم الأمر. * * @param array $parameters * @param string $field * @return string */protected function PreparationUniqueIdsRule($parameters, $field) {// لا يتم إجراء الاستبدال إلا إذا استمر النموذج. إذا ($this->exists) {return 'unique_ids:' . $this->getKey(); }إرجاع "unique_ids"؛ }
في هذه الحالة، إذا تم حفظ النموذج ويحتوي على مفتاح أساسي 10
، فسيتم استبدال القاعدة unique_ids
بقاعدة unique_ids:10
.
يتم إطلاق أحداث مختلفة بواسطة السمة أثناء عملية التحقق من الصحة والتي يمكنك ربطها للتأثير على عملية التحقق من الصحة.
للربط، تحتاج أولاً إلى إضافة خاصية $observeables
إلى النموذج الخاص بك (أو النموذج الأساسي). يتيح هذا ببساطة لـ Eloquent معرفة أن نموذجك يمكنه الاستجابة لهذه الأحداث.
/** * كشف المستخدم عن الأحداث التي يمكن ملاحظتها * * @var array */protected $observables = ['validating', 'validated'];
عندما يكون التحقق على وشك الحدوث، سيتم إطلاق الحدث eloquent.validating: ModelName
، حيث سيقوم المعامل $event
saving
أو restoring
. على سبيل المثال، إذا كنت تقوم بتحديث نموذج AppUser
بمساحة اسم، فسيكون الحدث eloquent.validating: AppUser
. إذا استمعت لأي من هذه الأحداث وقمت بإرجاع قيمة، فيمكنك منع حدوث التحقق من الصحة بشكل كامل.
Event::listen('eloquent.validating:*', function($model, $event) {// التحقق من صحة الروليت الروسية الزائفة.if (rand(1, 6) === 1) {return false; } });
بعد حدوث التحقق من الصحة، هناك أيضًا مجموعة من الأحداث validated
والتي يمكنك ربطها بالأحداث passed
والأحداث failed
والأحداث skipped
. بالنسبة للمثال أعلاه الذي فشل في التحقق من الصحة، يمكنك الحصول على الحدث eloquent.validated: AppUser
.
يوجد حاليًا خطأ في Laravel (راجع الإصدار رقم 1181) يمنع إطلاق أحداث النموذج أكثر من مرة في مجموعة الاختبار. وهذا يعني أن الاختبار الأول الذي يستخدم اختبارات النموذج سينجح ولكن أي اختبارات لاحقة ستفشل. هناك بعض الحلول المؤقتة المدرجة في هذا الموضوع والتي يمكنك استخدامها لاجتياز اختباراتك في هذه الأثناء.
نظرًا لأن Laravel قد تحول إلى Liferaft بغرض تتبع الأخطاء وطلبات السحب، فقد لا تكون المشكلة المذكورة أعلاه متاحة. يحتوي هذا Gist على مثال TestCase.php
الذي يوضح لك كيفية إعادة تعيين أحداث جميع نماذجك بين الاختبارات بحيث تعمل كما هو متوقع.
هناك عدد من الطرق التي يمكنك اتباعها لاستخدام نموذج التحقق من الصحة في وحدات التحكم الخاصة بك، ولكن هنا مثال واحد يستخدم FormRequest الجديد في Laravel 5 (إذا كنت ترغب في رؤية مثال آخر لوحدة التحكم بدون FormRequest، تحقق من الإصدار 4.2+ من هذه الحزمة.
يحافظ هذا المثال على نظافة التعليمات البرمجية الخاصة بك عن طريق السماح لـ FormRequest بالتعامل مع التحقق من صحة النموذج الخاص بك والنموذج بالتعامل مع التحقق من الصحة الخاص به. من خلال تمكين استثناءات التحقق من الصحة، يمكنك تقليل تعليمات برمجية وحدة التحكم المتكررة (كتل المحاولة/التقاط) والتعامل مع استثناءات التحقق من صحة النموذج عالميًا (يجب أن تحافظ طلبات النماذج الخاصة بك على صلاحية نماذجك، لذلك إذا أصبح نموذجك غير صالح، فهذا حدث استثنائي ).
<?php namespace AppHttpControllers;use AppHttpRequestsPostFormRequest;use IlluminateRoutingController;فئة PostsController توسع وحدة التحكم {محمي $post؛ وظيفة عامة __construct(Post $post) {$this->post = $post; }// ... مخزن الوظائف العامة (PostFormRequest $request) {// سيطرح المنشور استثناءً إذا لم يكن صالحًا.$post = $this->post->create($request->input());// تم حفظ المنشور بنجاح.return redirect()->route( "posts.show"، $post)؛ } }
يمكنك بعد ذلك اكتشاف استثناء التحقق من صحة النموذج في app/Exceptions/Handler.php
والتعامل معه حسب حاجتك.
تقديم الوظيفة العامة (طلب $، استثناء $e) {if ($e مثيل WatsonValidatingValidationException) {return back()->withErrors($e)->withInput(); }parent::render($request, $e); }