การตรวจสอบความถูกต้องเป็นคุณลักษณะหนึ่งของโมเดล 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);
-