लार्वेल अनुरोध :: सभी () स्टेटिक रूप से कॉल नहीं किया जाना चाहिए


90

लारवेल में, मैं अपने नियंत्रक में $input = Request::all();एक store()विधि पर कॉल करने की कोशिश कर रहा हूं , लेकिन मुझे निम्न त्रुटि मिल रही है:

गैर-स्थैतिक विधि Illuminate\Http\Request::all()को $thisअसंगत संदर्भ से मानते हुए, सांख्यिकीय रूप से नहीं कहा जाना चाहिए

किसी भी मदद से यह सही करने के लिए सबसे अच्छा तरीका है? (मैं एक लाराकास्ट का अनुसरण कर रहा हूं)


@patricus, क्षमा करें, मुझे 5 कहना चाहिए था
Moose

ऐसा लगता है कि आप मुखौटे का उपयोग नहीं कर रहे हैं। क्या use Illuminate\Http\Request;आपके नियंत्रक में कोई कथन है?
पितृ पक्ष

@patricus, मेरे पास ateuse Illuminate \ Http \ Request है; मेरे नियंत्रक के शीर्ष पर बयान।
मूस

1
@patricus मैं Illuminate\Http\Requestपैकेज में / विक्रेता हालांकि नहीं है। क्या मुझे इसे अलग से डाउनलोड करना होगा?
मूस

Illuminateसंकुल laravel / ढांचे पैकेज के भाग के रूप में शामिल किए गए हैं। यदि आप /vendor/laravel/framework/src/Illuminate/...
लारवेल

जवाबों:


222

त्रुटि संदेश Requestमुखौटा के माध्यम से नहीं जाने के कारण है ।

परिवर्तन

use Illuminate\Http\Request;

सेवा

use Request;

और यह काम करना शुरू कर देना चाहिए।

Config / app.php फ़ाइल में, आप वर्ग उपनामों की एक सूची पा सकते हैं। वहां, आप देखेंगे कि आधार वर्ग Requestको कक्षा में बदल दिया गया है Illuminate\Support\Facades\Request। इस वजह से, Requestकिसी नामांकित फ़ाइल में मुखौटा का उपयोग करने के लिए , आपको आधार वर्ग का उपयोग करने के लिए निर्दिष्ट करने की आवश्यकता है use Request;:।

संपादित करें

चूंकि यह प्रश्न कुछ ट्रैफ़िक प्राप्त करने के लिए लगता है, इसलिए मैं जवाब को थोड़ा अपडेट करना चाहता था क्योंकि लारवेल 5 आधिकारिक तौर पर जारी किया गया था।

जबकि ऊपर अभी भी तकनीकी रूप से सही है और काम करेगा use Illuminate\Http\Request; निर्भरता इंजेक्शन बनाम फेस पर निर्भर होने का उपयोग करने की दिशा में पुश डेवलपर्स को मदद करने के लिए नए नियंत्रक टेम्पलेट में बयान शामिल है।

निर्माणकर्ता में अनुरोध ऑब्जेक्ट को इंजेक्ट करते समय (या विधियों, जैसा कि लारावेल 5 में उपलब्ध है), यह वह Illuminate\Http\Requestवस्तु है जिसे इंजेक्ट किया जाना चाहिए, न कि Requestमुखौटा।

इसलिए, अनुरोध मुखौटा के साथ काम करने के लिए नियंत्रक टेम्पलेट को बदलने के बजाय, दिए गए नियंत्रक टेम्पलेट के साथ काम करना और निर्भरता इंजेक्शन (निर्माणकर्ता या विधियों के माध्यम से) का उपयोग करना बेहतर है।

विधि के माध्यम से उदाहरण

<?php namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class UserController extends Controller {

    /**
     * Store a newly created resource in storage.
     *
     * @param  Illuminate\Http\Request  $request
     * @return Response
     */
    public function store(Request $request) {
        $name = $request->input('name');
    }
}

कंस्ट्रक्टर के माध्यम से उदाहरण

<?php namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class UserController extends Controller {

    protected $request;

    public function __construct(Request $request) {
        $this->request = $request;
    }

    /**
     * Store a newly created resource in storage.
     *
     * @return Response
     */
    public function store() {
        $name = $this->request->input('name');
    }
}

3
उत्तर सही है, लेकिन वरीयता से बाहर मैं इल्लुमिनाट \ Support \ Facades \ Request का उपयोग करेगा; क्योंकि व्यक्तिगत रूप से मुझे लगता है कि लारवेल के रूट नेमस्पेस को सब कुछ अलियास करने की आदत पहले स्थान पर नामस्थान रखने की बात के खिलाफ है। यह एपीआई प्रलेखन को उत्पन्न करने के लिए कठिन बनाता है क्योंकि एपीजन / phpdoc "अनुरोध" वर्ग को खोजने में सक्षम नहीं होगा।
डेलबैबेल

4
वास्तव में, आपको कारीगर के बॉयलरप्लेट को बदलने की आवश्यकता नहीं है: नियंत्रक। अगर आप रिक्वेस्ट को बिना इंजेक्ट करने के लिए इसे $ इनपुट = \ Request :: all () (नोटिस द \ _) का उपयोग करना चाहते हैं। यदि आप सार्वजनिक myFunction (अनुरोध $ अनुरोध () $ $ = $ अनुरोध-> सभी) () का उपयोग करके इंजेक्शन का उपयोग करना चाहते हैं या इसे निर्माता में इंजेक्ट करते हैं और इसे एक वर्ग चर में निर्दिष्ट करते हैं
shock_gone_wild

2
Request::all();जब मैं उपयोग करता हूं तो मैं उपयोग क्यों नहीं कर सकता हूं use Illuminate\Http\Request; ?
SA__

@SA__ अनुरोध :: सभी () एक नया तरीका है। तो आपको use Illuminate\Support\Facades\Request; इसके बजायuse Illuminate\Http\Request;
थबंग

@redA वहाँ एक तरीका है अनुरोध :: सभी () प्रत्यक्ष तरीके का उपयोग करने के लिए (और मुखौटा वर्ग के माध्यम से नहीं)?
cid

6

लारवेल के जादू इंजेक्शन का उपयोग करके नियंत्रक में अनुरोध ऑब्जेक्ट को इंजेक्ट करें और फिर गैर-सांख्यिकीय रूप से फ़ंक्शन तक पहुंचें। लारवेल स्वचालित रूप से कंक्रीट निर्भरता को ऑटोलॉडेड कक्षाओं में इंजेक्ट करेगा

class MyController() 
{

   protected $request;

   public function __construct(\Illuminate\Http\Request $request)
   {
       $this->request = $request;
   }

   public function myFunc()
   {
       $input = $this->request->all();
   }

}

5

request()इसके बजाय सहायक का उपयोग करें । आपको useकथनों के बारे में चिंता करने की जरूरत नहीं है और इस तरह की समस्या फिर से नहीं होगी।

$input = request()->all();

सरल


4

मुखौटा एक अन्य अनुरोध वर्ग है, इसे पूरे रास्ते से एक्सेस करें:

$input = \Request::all();

लार्वा 5 से आप इसे request()फंक्शन के माध्यम से भी एक्सेस कर सकते हैं :

$input = request()->all();

3

मैंने सोचा कि भविष्य के आगंतुकों के लिए यह उपयोगी होगा कि वे यहां क्या हो रहा है, इस बारे में थोड़ा स्पष्टीकरण दें।

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();

        // ...
    }
}

इस दृष्टिकोण के कई लाभ हैं लेकिन मेरी व्यक्तिगत राय में निर्भरता इंजेक्शन के लिए सबसे बड़ा समर्थक यह है कि यह आपके कोड को परीक्षण करने के लिए आसान बनाता है। अपनी कक्षाओं की निर्भरता को कंस्ट्रक्टर या विधि तर्कों के रूप में घोषित करने से, उन निर्भरताओं और इकाई को अलग-थलग करने के लिए परीक्षण करना आसान हो जाता है।


1
use Illuminate\Http\Request;
public function store(Request $request){
   dd($request->all());
}

संदर्भ के संदर्भ में भी ऐसा ही है

use Request;
public function store(){
   dd(Request::all());
}

1

जब आप api.php फ़ाइल में लाइब्रेरी का आयात करते हैं तो यह भी होता है। यह कुछ IDE के रूट क्लास को नहीं खोजने के लिए इसे आयात करने के सुझाव से होता है ।

बस इसे हटा दें और सब कुछ ठीक काम करने जा रहा है।

use Illuminate\Routing\Route;

अपडेट करें:

लगता है कि यदि आप इस पुस्तकालय को जोड़ते हैं तो यह त्रुटि का कारण नहीं बनेगा

use Illuminate\Support\Facades\Route;

यह मेरे लिए काम करता है, लेकिन मुझे अभी भी यह नहीं पता है कि आईडीई कारण मेरे लिए लागू नहीं होगा, क्योंकि जिस तरह से मैंने परियोजना को उत्पन्न किया और मैं कोड का उपयोग करता हूं।
एल्डो ओकेवेयर

0

मैं use Illuminate\Http\Request;अपने नियंत्रक के शीर्ष पर भी इस समस्या का सामना कर रहा था । अपने बालों को तब तक खींचते रहे जब तक मुझे एहसास नहीं हो गया कि मैं $request::ip()इसके बजाय कर रहा हूं $request->ip()। आपके साथ ऐसा हो सकता है यदि आप पूरी रात सोए नहीं और आधी-खुली आँखों से सुबह 6 बजे कोड देख रहे हैं।

आशा है कि यह किसी को नीचे सड़क पर मदद करता है


0

मैं इसे एक गुंजाइश परिभाषा के साथ काम करते हैं

सार्वजनिक समारोह पगार (\ Illuminate \ Http \ Request $ अनुरोध) {//


2
कृपया न केवल यह दिखाएं कि कौन सा कोड काम कर रहा है, बल्कि यह भी बताएं कि आपने ऐसा क्यों किया।
creyD
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.