मैंने सोचा कि भविष्य के आगंतुकों के लिए यह उपयोगी होगा कि वे यहां क्या हो रहा है, इस बारे में थोड़ा स्पष्टीकरण दें।
Illuminate\Http\Requestवर्ग
लारवेल की Illuminate\Http\Requestकक्षा में एक विधि है जिसका नाम है all(वास्तव में allविधि को एक विशेषता में परिभाषित किया गया है जिसे Requestवर्ग उपयोग करता है, कहा जाता है Illuminate\Http\Concerns\InteractsWithInput)। allलिखने के समय विधि का हस्ताक्षर इस तरह दिखता है:
public function all($keys = null)
इस पद्धति को staticतब और तब परिभाषित नहीं किया जाता है, जब आप विधि को स्थिर संदर्भ में कॉल करने का प्रयास करते हैं, अर्थात Illuminate\Http\Request::all()आपको ओपी के प्रश्न में प्रदर्शित त्रुटि मिलेगी। allविधि एक उदाहरण विधि और जानकारी के साथ सौदों कि का एक उदाहरण में मौजूद हैRequest इस तरह से यह बुला तो कोई मतलब नहीं है, वर्ग।
अग्रभाग
लारवेल में एक मुखौटा डेवलपर्स को 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में कोई पैरामीटर नहीं है
- कुंजी द्वारा लौटाए का उपयोग कर आईओसी कंटेनर से अंतर्निहित वस्तु ले लो
getFacadeAccessor, इस मामले में एक में Illuminate\Http\Requestवस्तु
- गतिशील रूप से उस विधि को कॉल करें जो इसे प्राप्त की गई वस्तु पर वैधानिक रूप से प्राप्त हुई है, इस मामले
allमें इसके उदाहरण पर गैर-सांख्यिकीय रूप से कहा जाता है Illuminate\Http\Request।
यही कारण है कि, जैसा कि @patricus ने ऊपर दिए गए अपने उत्तर में बताया है, use/ आयात विवरण को मुखौटा को संदर्भित करने के लिए बदलकर , त्रुटि अब नहीं है, क्योंकि जहाँ तक PHP का संबंध है, allको सही रूप में उदाहरण के रूप में कहा गया है Illuminate\Http\Request।
एलियासिंग
अलियासिंग एक और विशेषता है जो लारवेल सुविधा के लिए प्रदान करता है। यह उर्फ क्लासेस को प्रभावी ढंग से बनाकर काम करता है जो रूट नेमस्पेस में 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,
लारवेल आपके कॉन्फ़िगरेशन के आधार पर आपके लिए ये अन्य वर्ग बनाता है, और यह आपको रूट नेमस्पेस में उपलब्ध कक्षाओं का उपयोग करने की अनुमति देता है (जैसा कि aliasesकॉन्फ़िगरेशन की स्ट्रिंग कुंजियों द्वारा संदर्भित किया जाता है ) जैसे कि आप स्वयं मुखौटा का उपयोग कर रहे हैं:
use Request:
class YourController extends Controller
{
public function yourMethod()
{
$input = Request::all();
}
}
निर्भरता इंजेक्शन पर एक नोट
जबकि लारवेल में अभी भी facades और अलियासिंग प्रदान की जाती है, यह संभव है और आमतौर पर निर्भरता इंजेक्शन मार्ग के नीचे जाने के लिए प्रोत्साहित किया जाता है। उदाहरण के लिए, उसी परिणाम को प्राप्त करने के लिए कंस्ट्रक्टर इंजेक्शन का उपयोग करना:
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();
}
}
इस दृष्टिकोण के कई लाभ हैं लेकिन मेरी व्यक्तिगत राय में निर्भरता इंजेक्शन के लिए सबसे बड़ा समर्थक यह है कि यह आपके कोड को परीक्षण करने के लिए आसान बनाता है। अपनी कक्षाओं की निर्भरता को कंस्ट्रक्टर या विधि तर्कों के रूप में घोषित करने से, उन निर्भरताओं और इकाई को अलग-थलग करने के लिए परीक्षण करना आसान हो जाता है।