ฉันคิดว่ามันจะเป็นประโยชน์สำหรับผู้มาเยือนในอนาคตในการให้คำอธิบายเล็กน้อยเกี่ยวกับสิ่งที่เกิดขึ้นที่นี่
Illuminate\Http\Request
ระดับ
Illuminate\Http\Request
คลาสของ Laravel มีเมธอดชื่อหนึ่งall
(อันที่จริงall
เมธอดถูกกำหนดในลักษณะที่Request
คลาสใช้เรียกIlluminate\Http\Concerns\InteractsWithInput
) ลายเซ็นของall
วิธีการในขณะที่เขียนมีลักษณะดังนี้:
public function all($keys = null)
วิธีนี้ไม่ได้ถูกกำหนดให้เป็นstatic
และเมื่อคุณพยายามเรียกใช้เมธอดในบริบทคงที่นั่นคือIlluminate\Http\Request::all()
คุณจะได้รับข้อผิดพลาดที่แสดงในคำถามของ OP all
วิธีคือวิธีการเช่นและเกี่ยวข้องกับข้อมูลที่มีอยู่ในตัวอย่างของการที่Request
ระดับจึงเรียกมันว่าในลักษณะนี้ทำให้รู้สึกไม่
อาคาร
ซุ้มใน Laravel ช่วยให้นักพัฒนาสามารถเข้าถึงวัตถุในคอนเทนเนอร์ IoC ได้อย่างสะดวกและเรียกวิธีการบนวัตถุเหล่านั้น นักพัฒนาสามารถเรียกเมธอด "แบบคงที่" บนส่วนหน้าได้เช่นRequest::all()
กัน แต่การเรียกเมธอดจริงบนวัตถุจริง ไม่ได้Illuminate\Http\Request
คงที่
ซุ้มทำงานเหมือนพร็อกซี - หมายถึงวัตถุในคอนเทนเนอร์ IoC และส่งการเรียกเมธอดแบบคงที่ไปยังวัตถุนั้น (ไม่คงที่) ตัวอย่างเช่นใช้ส่วนIlluminate\Support\Facades\Request
หน้าซึ่งดูเหมือนว่า:
class Request extends Facade
{
protected static function getFacadeAccessor()
{
return 'request';
}
}
ภายใต้ประทุนIlluminate\Support\Facades\Facade
คลาสพื้นฐานใช้เวทย์มนตร์ PHP บางอย่างคือ__callStatic
วิธีการ:
- ฟังการเรียกวิธีการแบบคงที่ในกรณีนี้
all
โดยไม่มีพารามิเตอร์
- หยิบวัตถุต้นแบบจากคอนเทนเนอร์ IoC โดยใช้คีย์ที่ส่งคืนโดย
getFacadeAccessor
ในกรณีนี้กIlluminate\Http\Request
วัตถุ
- แบบไดนามิกเรียกวิธีการที่จะได้รับแบบคงที่บนวัตถุที่ได้ดึงในกรณีนี้จะเรียกว่าไม่ใช่แบบคงที่ในตัวอย่างของ
all
Illuminate\Http\Request
นี่คือเหตุผลที่ @patricus ชี้ให้เห็นในคำตอบของเขาข้างต้นโดยการเปลี่ยนuse
คำสั่ง / import เพื่ออ้างถึงส่วนหน้าข้อผิดพลาดจะไม่มีอีกต่อไปเนื่องจากเท่าที่เกี่ยวข้องกับ PHP all
ได้ถูกเรียกอย่างถูกต้องในอินสแตนซ์ของIlluminate\Http\Request
.
นามแฝง
นามแฝงเป็นอีกคุณสมบัติหนึ่งที่ Laravel มอบให้เพื่อความสะดวก ทำงานได้อย่างมีประสิทธิภาพโดยการสร้างคลาสนามแฝงที่ชี้ไปยัง facades ในเนมสเปซรูท หากคุณดูconfig/app.php
ไฟล์ของคุณภายใต้aliases
คีย์คุณจะพบรายการการแมปสตริงกับคลาสด้านหน้า ตัวอย่างเช่น:
'aliases' => [
'App' => Illuminate\Support\Facades\App::class,
'Artisan' => Illuminate\Support\Facades\Artisan::class,
'Auth' => Illuminate\Support\Facades\Auth::class,
'Request' => Illuminate\Support\Facades\Request::class,
Laravel สร้างคลาสนามแฝงให้คุณตามการกำหนดค่าของคุณและสิ่งนี้ช่วยให้คุณสามารถใช้คลาสที่มีอยู่ในเนมสเปซรูท (ตามที่อ้างถึงโดยคีย์สตริงของการกำหนดค่าaliases
) ราวกับว่าคุณกำลังใช้ส่วนหน้าเอง:
use Request:
class YourController extends Controller
{
public function yourMethod()
{
$input = Request::all();
}
}
หมายเหตุเกี่ยวกับการฉีดแบบพึ่งพา
ในขณะที่ยังคงมี facades และ aliasing ใน Laravel แต่ก็เป็นไปได้และโดยปกติแล้วจะได้รับการสนับสนุนให้ลงไปตามเส้นทางการฉีดแบบพึ่งพา ตัวอย่างเช่นการใช้การฉีดตัวสร้างเพื่อให้ได้ผลลัพธ์เดียวกัน:
use Illuminate\Http\Request;
class YourController extends Controller
{
protected $request;
public function __construct(Request $request)
{
$this->request = $request;
}
public function yourMethod()
{
$input = $this->request->all();
}
}
มีประโยชน์หลายประการสำหรับแนวทางนี้ แต่ในความเห็นส่วนตัวของฉันโปรที่ยิ่งใหญ่ที่สุดสำหรับการฉีดแบบพึ่งพาคือทำให้โค้ดของคุณทดสอบได้ง่ายขึ้น โดยการประกาศการอ้างอิงของคลาสของคุณเป็นตัวสร้างหรืออาร์กิวเมนต์เมธอดมันง่ายมากที่จะล้อเลียนการอ้างอิงเหล่านั้นและทดสอบหน่วยของคุณแยกกัน