การตรวจสอบความถูกต้องเป็นคุณลักษณะหนึ่งของโมเดล 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; ป้องกัน $rules = [ 'title' => 'required', 'slug' => 'required|unique:posts,slug', 'content' => 'required' - -
คุณยังสามารถเพิ่มลักษณะให้กับ BaseModel
ได้หากคุณใช้งานและมันจะใช้ได้กับทุกรุ่นที่ขยายออกไป ไม่เช่นนั้นคุณก็สามารถขยาย WatsonValidatingValidatingModel
แทน Eloquent
ได้
หมายเหตุ: คุณจะต้องตั้งค่าคุณสมบัติ $rules
บนโมเดลใดๆ ที่ขยายมาจาก BaseModel
ที่ใช้คุณลักษณะ หรือตั้งค่าอาร์เรย์ว่างเป็น $rules
สำหรับ BaseModel
หากคุณไม่ทำเช่นนั้น คุณจะต้องจบลงด้วย LogicException with message 'Relationship method must return an object of type IlluminateDatabaseEloquentRelationsRelation'
ตอนนี้คุณสามารถเข้าถึงฟังก์ชั่นที่น่าพึงพอใจได้แล้ว
// ตรวจสอบว่าโมเดลนั้นถูกต้องหรือไม่$post->isValid(); // true// หรือตรวจสอบว่าไม่ถูกต้องหรือไม่.$post->isInvalid(); // false// เมื่อคุณได้พิจารณาความถูกต้องของโมเดลแล้ว// คุณจะได้รับข้อผิดพลาด$post->getErrors(); // ข้อผิดพลาด MessageBag
การตรวจสอบความถูกต้องของโมเดลยังกลายเป็นเรื่องง่ายอีกด้วย
if ( ! $post->save()) {// Oops.return เปลี่ยนเส้นทาง()->เส้นทาง ('posts.create') ->withErrors($post->getErrors()) ->withInput(); } } เปลี่ยนเส้นทางกลับ () -> เส้นทาง ('posts.show', $post->id) ->withSuccess("บันทึกโพสต์ของคุณเรียบร้อยแล้ว");
มิฉะนั้น หากคุณต้องการใช้ข้อยกเว้นเมื่อตรวจสอบโมเดล คุณสามารถใช้เมธอด saveOrFail()
ได้ ขณะนี้ จะมีข้อยกเว้นเกิดขึ้นเมื่อคุณพยายามบันทึกโมเดลที่ไม่ถูกต้อง
$โพสต์->saveOrFail();
คุณ ไม่จำเป็นต้องจับข้อยกเว้น หากคุณไม่ต้องการ Laravel รู้วิธีจัดการ ValidationException
และจะเปลี่ยนเส้นทางกลับโดยอัตโนมัติพร้อมอินพุตแบบฟอร์มและข้อผิดพลาด หากคุณต้องการจัดการมันด้วยตัวเองแม้ว่าคุณจะทำได้
ลอง {$post->saveOrFail(); } catch (WatsonValidatingValidationException $e) {$errors = $e->getErrors();ส่งคืนการเปลี่ยนเส้นทาง()->เส้นทาง('posts.create') ->withErrors($ข้อผิดพลาด) ->withInput(); -
โปรดทราบว่าคุณสามารถส่งข้อยกเว้นไปยังเมธอด withErrors()
เช่น withErrors($e)
และ Laravel จะรู้วิธีจัดการมัน
หากคุณกำลังใช้โมเดลและต้องการดำเนินการบันทึกที่ข้ามการตรวจสอบความถูกต้อง คุณสามารถทำได้ สิ่งนี้จะส่งกลับผลลัพธ์เดียวกันกับที่คุณเรียกว่า save()
ในโมเดลที่ไม่มีคุณสมบัติ
$โพสต์->forceSave();
หากคุณต้องการให้มีข้อยกเว้นเกิดขึ้นตามค่าเริ่มต้นเมื่อใช้เมธอด save()
แทนที่จะต้องใช้ saveOrFail()
คุณสามารถตั้งค่าคุณสมบัติต่อไปนี้ในโมเดลหรือ BaseModel
ของคุณ
/** * ไม่ว่าโมเดลควรจะโยน ValidationException หรือไม่หาก * ไม่ผ่านการตรวจสอบ หากไม่ได้ตั้งค่า ค่าเริ่มต้นจะเป็นเท็จ * * @var boolean */protected $throwValidationExceptions = true;
หากคุณต้องการบันทึกครั้งเดียวโดยใช้ข้อยกเว้นหรือคืนค่า คุณสามารถใช้เมธอด saveOrFail()
และ saveOrReturn
หากต้องการแสดงข้อความแสดงข้อผิดพลาดในการตรวจสอบแบบกำหนดเอง เพียงเพิ่มคุณสมบัติ $validationMessages
ให้กับโมเดลของคุณ
/** * ข้อความตรวจสอบความถูกต้องที่จะส่งต่อไปยังเครื่องมือตรวจสอบ * * @var array */protected $validationMessages = ['slug.unique' => "มีโพสต์อื่นใช้ slug นั้นแล้ว"];
คุณอาจสังเกตเห็นว่าเรากำลังใช้กฎ unique
บนตัวทาก ซึ่งจะใช้งานไม่ได้หากเราอัปเดตโมเดลที่ยังคงอยู่ โชคดีที่การตรวจสอบจะดูแลเรื่องนี้ให้กับคุณและผนวกคีย์หลักของโมเดลเข้ากับกฎเพื่อให้กฎทำงานได้ตามที่คาดไว้ โดยไม่สนใจรูปแบบปัจจุบัน
คุณสามารถปรับฟังก์ชันนี้ได้โดยการตั้งค่าคุณสมบัติ $injectUniqueIdentifier
บนโมเดลของคุณ
/** * ว่าโมเดลควรแทรกตัวระบุลงในกฎการตรวจสอบที่ไม่ซ้ำกัน * ก่อนที่จะพยายามตรวจสอบหรือไม่ หากไม่ได้ตั้งค่าคุณสมบัตินี้ * ในโมเดล ค่าเริ่มต้นจะเป็น "จริง" * * @var boolean */protected $injectUniqueIdentifier = true;
เราสนับสนุนกฎ unique
Laravel ที่ให้มาตั้งแต่แรกเริ่ม นอกจากนี้เรายังสนับสนุนกฎ felixkiss/uniquewith-validator ยอดนิยม แต่คุณจะต้องเลือกเข้าร่วม เพียงเพิ่ม use WatsonValidatingInjectorsUniqueWithInjector
หลังจากที่คุณนำเข้าลักษณะการตรวจสอบแล้ว
ง่ายต่อการสนับสนุนกฎการแทรกเพิ่มเติมหากคุณต้องการ สมมติว่าคุณต้องการสนับสนุนกฎเพิ่มเติมที่คุณเรียกว่า unique_ids
ซึ่งใช้คีย์หลักของโมเดล (ไม่ว่าด้วยเหตุผลใดก็ตาม) คุณเพียงแค่ต้องเพิ่มกฎแบบ Camel-cased ซึ่งยอมรับพารามิเตอร์ที่มีอยู่และชื่อฟิลด์ แล้วส่งคืนกฎการแทนที่
/** * เตรียมกฎ Unique_ids โดยเพิ่มตัวระบุโมเดลหากจำเป็น * * @param array $parameters * @param string $field * @return string */protected function allowanceUniqueIdsRule($parameters, $field) {// ดำเนินการแทนที่เฉพาะในกรณีที่โมเดลยังคงอยู่เท่านั้น if ($this->exists) {return 'unique_ids:' $นี่->getKey(); }ส่งคืน 'unique_ids'; -
ในกรณีนี้ หากโมเดลได้รับการบันทึกและมีคีย์หลักเป็น 10
กฎ unique_ids
จะถูกแทนที่ด้วย unique_ids:10
เหตุการณ์ต่างๆ เกิดขึ้นจากลักษณะในระหว่างกระบวนการตรวจสอบ ซึ่งคุณสามารถเชื่อมโยงเข้าไปเพื่อส่งผลกระทบต่อกระบวนการตรวจสอบได้
หากต้องการเชื่อมต่อ ก่อนอื่นคุณต้องเพิ่มคุณสมบัติ $observeables
ลงในโมเดลของคุณ (หรือโมเดลพื้นฐาน) สิ่งนี้ช่วยให้ Eloquent รู้ว่าโมเดลของคุณสามารถตอบสนองต่อเหตุการณ์เหล่านี้ได้
/** * ผู้ใช้เปิดเผยเหตุการณ์ที่สังเกตได้ * * @var array */protected $observables = ['ตรวจสอบ', 'ตรวจสอบแล้ว'];
เมื่อการตรวจสอบความถูกต้องกำลังจะเกิดขึ้น เหตุการณ์ eloquent.validating: ModelName
จะเริ่มทำงาน โดยที่พารามิเตอร์ $event
จะถูก saving
หรือ restoring
ตัวอย่างเช่น หากคุณกำลังอัปเดต AppUser
โมเดลเนมสเปซ เหตุการณ์จะเป็น eloquent.validating: AppUser
หากคุณรับฟังเหตุการณ์ใดๆ เหล่านี้และส่งคืนค่า คุณสามารถป้องกันไม่ให้การตรวจสอบความถูกต้องเกิดขึ้นได้อย่างสมบูรณ์
เหตุการณ์::listen('eloquent.validating:*', function($model, $event) {// Pseudo-Russian roulette validation.if (rand(1, 6) === 1) {return false; - -
หลังจากการตรวจสอบความถูกต้องเกิดขึ้น ยังมีเหตุการณ์ validated
อีกมากมายที่คุณสามารถเชื่อมโยงได้ สำหรับเหตุการณ์ passed
failed
และ skipped
สำหรับตัวอย่างข้างต้นที่ไม่ผ่านการตรวจสอบ คุณอาจได้รับเหตุการณ์ eloquent.validated: AppUser
ขณะนี้มีข้อบกพร่องใน Laravel (ดูปัญหา #1181) ที่ป้องกันไม่ให้เหตุการณ์โมเดลเริ่มทำงานมากกว่าหนึ่งครั้งในชุดทดสอบ ซึ่งหมายความว่าการทดสอบครั้งแรกที่ใช้การทดสอบแบบจำลองจะผ่าน แต่การทดสอบที่ตามมาใดๆ จะล้มเหลว มีวิธีแก้ไขปัญหาชั่วคราวสองสามรายการที่แสดงอยู่ในชุดข้อความนั้น ซึ่งคุณสามารถใช้เพื่อให้การทดสอบของคุณผ่านในระหว่างนี้
เนื่องจาก Laravel ได้เปลี่ยนมาใช้ Liferaft เพื่อวัตถุประสงค์ในการติดตามจุดบกพร่องและดึงคำขอ ปัญหาที่กล่าวถึงข้างต้นอาจไม่พร้อมใช้งาน ส่วนสำคัญนี้มีตัวอย่าง TestCase.php
ซึ่งแสดงวิธีรีเซ็ตเหตุการณ์ของโมเดลทั้งหมดของคุณระหว่างการทดสอบเพื่อให้ทำงานตามที่คาดไว้
มีหลายวิธีที่คุณสามารถดำเนินการเกี่ยวกับการใช้โมเดลการตรวจสอบความถูกต้องในคอนโทรลเลอร์ของคุณ อย่างไรก็ตาม นี่คือตัวอย่างหนึ่งที่ใช้ประโยชน์จาก FormRequest ใหม่ใน Laravel 5 (หากคุณต้องการดูตัวอย่างคอนโทรลเลอร์อื่นที่ไม่มี FormRequest ให้ตรวจสอบ เวอร์ชัน 4.2+ ของแพ็คเกจนี้
ตัวอย่างนี้ทำให้โค้ดของคุณสะอาดโดยอนุญาตให้ FormRequest จัดการการตรวจสอบแบบฟอร์มของคุณและให้โมเดลจัดการการตรวจสอบของตัวเอง ด้วยการเปิดใช้ข้อยกเว้นการตรวจสอบ คุณสามารถลดโค้ดตัวควบคุมที่ซ้ำกัน (บล็อก try/catch) และจัดการข้อยกเว้นในการตรวจสอบความถูกต้องของแบบจำลองได้ทั่วโลก (คำขอแบบฟอร์มของคุณควรทำให้แบบจำลองของคุณใช้งานได้ ดังนั้นหากแบบจำลองของคุณไม่ถูกต้อง ถือเป็นเหตุการณ์ พิเศษ )
<?php เนมสเปซ AppHttpControllers; ใช้ AppHttpRequestsPostFormRequest; ใช้ IlluminateRoutingController; คลาส PostController ขยายคอนโทรลเลอร์ {ป้องกัน $post; ฟังก์ชั่นสาธารณะ __construct (โพสต์ $post) {$นี่->โพสต์ = $โพสต์; }// ...ร้านค้าฟังก์ชั่นสาธารณะ (PostFormRequest $request) {// โพสต์จะส่งข้อยกเว้นหากไม่ถูกต้อง$post = $this->post->create($request->input());// บันทึกโพสต์เรียบร้อยแล้ว return เปลี่ยนเส้นทาง()->route( 'posts.show', $โพสต์); - -
จากนั้น คุณสามารถตรวจจับข้อยกเว้นการตรวจสอบความถูกต้องของโมเดลได้ใน app/Exceptions/Handler.php
และจัดการกับมันตามที่คุณต้องการ
ฟังก์ชั่นสาธารณะแสดงผล ($ คำขอ, ข้อยกเว้น $ e) { ถ้า ($ e อินสแตนซ์ของ WatsonValidatingValidationException) { ส่งคืน () -> withErrors ($ e) -> withInput (); }พาเรนต์::render($คำขอ, $e); -