คุณเคยสร้างคอนโทรลเลอร์ที่คุณต้องทำงานมากมายเพื่อเตรียมตัวแปรที่จะส่งผ่านไปยังมุมมองหรือไม่? คุณสามารถย้ายงานประเภทนั้นไปยังสิ่งที่เรียกว่าโมเดลมุมมองได้ โดยพื้นฐานแล้ว โมเดลมุมมองเป็นคลาสง่ายๆ ที่รับข้อมูลบางส่วนและแปลงเป็นสิ่งที่ใช้สำหรับมุมมองได้
คุณจะพบคำอธิบายโดยละเอียดเพิ่มเติมและตัวอย่างที่ดีในบล็อกโพสต์นี้บน Stitcher.io
ผู้แต่งมุมมองดั้งเดิมของ Laravel ไม่เหมือนกับโมเดลมุมมองที่แพ็คเกจนี้ให้มา หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับความแตกต่าง โปรดไปที่บล็อกโพสต์นี้บน Stitcher.io
เราลงทุนทรัพยากรจำนวนมากเพื่อสร้างแพ็คเกจโอเพ่นซอร์สที่ดีที่สุดในระดับเดียวกัน คุณสามารถสนับสนุนเราได้โดยการซื้อหนึ่งในผลิตภัณฑ์ที่ต้องชำระเงินของเรา
เราขอขอบคุณอย่างยิ่งที่คุณส่งโปสการ์ดจากบ้านเกิดของคุณถึงเรา โดยระบุว่าคุณใช้แพ็คเกจใดของเรา คุณจะพบที่อยู่ของเราในหน้าติดต่อของเรา เราเผยแพร่โปสการ์ดที่ได้รับทั้งหมดบนวอลล์โปสการ์ดเสมือนของเรา
คุณสามารถติดตั้งแพ็คเกจผ่านทางผู้แต่ง:
composer require spatie/laravel-view-models
โมเดลมุมมองคือคลาสที่คุณสามารถใส่ตรรกะที่ซับซ้อนให้กับมุมมองของคุณได้ ซึ่งจะทำให้คอนโทรลเลอร์ของคุณเบาขึ้นเล็กน้อย คุณสามารถสร้างโมเดลมุมมองได้โดยขยาย SpatieViewModelsViewModel
ที่ให้มา
class PostViewModel extends ViewModel
{
public $ user ;
public $ post ;
public $ indexUrl = null ;
public function __construct ( User $ user , Post $ post = null )
{
$ this -> user = $ user ;
$ this -> post = $ post ;
$ this -> indexUrl = action ([PostsController::class, ' index ' ]);
}
public function post (): Post
{
return $ this -> post ?? new Post ();
}
public function categories (): Collection
{
return Category:: canBeUsedBy ( $ this -> user )-> get ();
}
}
จากนั้นคุณสามารถใช้คลาสโมเดลมุมมองในคอนโทรลเลอร์ของคุณดังนี้:
class PostsController
{
public function create ()
{
$ viewModel = new PostViewModel (
current_user ()
);
return view ( ' blog.form ' , $ viewModel );
}
public function edit ( Post $ post )
{
$ viewModel = new PostViewModel (
current_user (),
$ post
);
return view ( ' blog.form ' , $ viewModel );
}
}
ในมุมมอง คุณสามารถทำได้:
< input type = " text " value = " {{ $post -> title } } " />
< input type = " text " value = " {{ $post -> body } } " />
< select >
@foreach ( $categories as $category )
< option value = " {{ $category -> id } } " > {{ $category -> name } } </ option >
@endforeach
</ select >
< a href = " {{ $indexUrl } } " >Back</ a >
วิธีการและคุณสมบัติสาธารณะทั้งหมดในโมเดลมุมมองจะถูกเปิดเผยโดยอัตโนมัติในมุมมอง หากคุณไม่ต้องการให้วิธีการใดวิธีหนึ่งปรากฏในมุมมองของคุณ คุณก็สามารถเพิกเฉยได้
class PostViewModel extends ViewModel
{
protected $ ignore = [ ' ignoredMethod ' ];
/ / …
public function ignoredMethod () { / * … * / }
}
เมธอดเวทย์มนตร์ในตัวของ PHP ทั้งหมดจะถูกละเว้นโดยอัตโนมัติ
เป็นไปได้ที่จะส่งคืนโมเดลมุมมองจากคอนโทรลเลอร์โดยตรง ตามค่าเริ่มต้น ระบบจะส่งคืนการตอบสนอง JSON พร้อมข้อมูล
class PostsController
{
public function update ( Request $ request , Post $ post )
{
/ / …
return new PostViewModel ( $ post );
}
}
วิธีการนี้จะมีประโยชน์เมื่อทำงานกับแบบฟอร์มที่ส่งโดย AJAX
คุณยังสามารถส่งคืนมุมมองได้โดยตรง:
class PostsController
{
public function update ( Request $ request , Post $ post )
{
/ / …
return ( new PostViewModel ( $ post ))-> view ( ' post.form ' );
}
}
โปรดทราบว่าเมื่อตั้งค่าส่วนหัว Content-Type
ของคำขอเป็น JSON วิธีการนี้จะส่งคืนข้อมูล JSON แทนมุมมองที่แสดงผลด้วย
ดูโมเดลสามารถเปิดเผยฟังก์ชันที่ต้องใช้พารามิเตอร์เพิ่มเติม
class PostViewModel extends ViewModel
{
public function formatDate ( Carbon $ date ): string
{
return $ date -> format ( ' Y-m-d ' );
}
}
คุณสามารถใช้ฟังก์ชันเหล่านี้ในมุมมองดังนี้:
{{ $ formatDate ( $post -> created_at ) } }
แพ็คเกจนี้รวมคำสั่งช่างฝีมือเพื่อสร้างโมเดลมุมมองใหม่
php artisan make:view-model HomepageViewModel
โมเดลมุมมองนี้จะมีเนมสเปซ AppViewModels
และจะถูกบันทึกไว้ใน app/ViewModels
หรือในเนมสเปซที่กำหนดเอง เช่น AppBlog
php artisan make:view-model " Blog/PostsViewModel "
โมเดลมุมมองนี้จะมีเนมสเปซ AppBlogViewModels
และจะถูกบันทึกไว้ใน app/Blog/ViewModels
โปรดดู CHANGELOG สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่เปลี่ยนแปลงเมื่อเร็วๆ นี้
โปรดดูการมีส่วนร่วมเพื่อดูรายละเอียด
หากคุณพบข้อบกพร่องเกี่ยวกับการรักษาความปลอดภัย โปรดส่งอีเมลมาที่ [email protected] แทนการใช้ตัวติดตามปัญหา
ใบอนุญาตเอ็มไอที (MIT) โปรดดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม