W Laravel próbuję wywołać metodę w moim kontrolerze, ale $input = Request::all();
pojawia store()
się następujący błąd:
Metoda niestatyczna
Illuminate\Http\Request::all()
nie powinna być wywoływana statycznie, przyjmując$this
z niezgodnego kontekstu
Czy jest jakaś pomoc w znalezieniu najlepszego sposobu, aby to naprawić? (Podążam za Laracastem)
use Illuminate\Http\Request;
oświadczenie w swoim kontrolerze?Illuminate\Http\Request
pakietu w / vendor. Czy muszę to pobrać osobno?Illuminate
pakiety zostały włączone jako część pakietu laravel / ramowej. Jeśli chcesz spojrzeć na jakikolwiek kod źródłowy Laravel, znajdziesz go pod/vendor/laravel/framework/src/Illuminate/...
Odpowiedzi:
Komunikat o błędzie wynika z tego, że połączenie nie przechodzi przez
Request
fasadę.Zmiana
use Illuminate\Http\Request;
Do
use Request;
i powinno zacząć działać.
W pliku config / app.php można znaleźć listę aliasów klas. Tam zobaczysz, że klasa bazowa
Request
została przypisana doIlluminate\Support\Facades\Request
klasy. Ze względu na to, aby korzystać zRequest
fasadą w przestrzeni nazw pliku, musisz podać użyć klasy bazowej:use Request;
.Edytować
Ponieważ wydaje się, że to pytanie ma pewien ruch, chciałem trochę zaktualizować odpowiedź, odkąd oficjalnie wydano Laravel 5.
Chociaż powyższe jest nadal poprawne technicznie i będzie działać,
use Illuminate\Http\Request;
oświadczenie jest zawarte w nowym szablonie kontrolera, aby pomóc programistom popchnąć programistów w kierunku używania wstrzykiwania zależności w porównaniu z poleganiem na elewacji.Podczas wstrzykiwania obiektu Request do konstruktora (lub metod dostępnych w Laravel 5), to
Illuminate\Http\Request
obiekt powinien zostać wstrzyknięty, a nieRequest
fasada.Dlatego zamiast zmieniać szablon kontrolera tak, aby działał z fasadą żądania, lepiej jest pracować z danym szablonem kontrolera i przejść do stosowania wstrzykiwania zależności (za pomocą konstruktora lub metod).
Przykład metodą
<?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'); } }
Przykład za pomocą konstruktora
<?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'); } }
źródło
Request::all();
gdy używamuse Illuminate\Http\Request;
?use Illuminate\Support\Facades\Request;
zamiastuse Illuminate\Http\Request;
Wstrzyknij obiekt żądania do kontrolera za pomocą magicznego wstrzyknięcia Laravela, a następnie uzyskaj dostęp do funkcji w sposób niestatyczny. Laravel automatycznie wprowadzi konkretne zależności do automatycznie ładowanych klas
class MyController() { protected $request; public function __construct(\Illuminate\Http\Request $request) { $this->request = $request; } public function myFunc() { $input = $this->request->all(); } }
źródło
request()
zamiast tego użyj pomocnika. Nie musisz martwić sięuse
stwierdzeniami, a zatem tego rodzaju problem nie powtórzy się.prosty
źródło
Fasada jest kolejną klasą Request, wejdź do niej pełną ścieżką:
Z poziomu laravel 5 możesz również uzyskać do niego dostęp za pomocą
request()
funkcji:źródło
Pomyślałem, że przyszłym odwiedzającym przyda się trochę wyjaśnienia tego, co się tutaj dzieje.
Illuminate\Http\Request
klasaIlluminate\Http\Request
Klasa Laravela ma metodę o nazwieall
(w rzeczywistościall
metoda jest zdefiniowana w funkcji, którejRequest
używa klasa, zwanaIlluminate\Http\Concerns\InteractsWithInput
). Podpisall
metody w momencie pisania wygląda następująco:public function all($keys = null)
Ta metoda nie jest zdefiniowana jako
static
i tak, gdy spróbujesz wywołać metodę w kontekście statycznym, tj.Illuminate\Http\Request::all()
Otrzymasz błąd wyświetlany w pytaniu OP.all
Metodą jest metoda instancji i dotyczy informacji, które są obecne w instancjiRequest
klasy, więc nazywając go w ten sposób nie ma sensu.Fasady
Fasada w Laravel zapewnia programistom wygodny sposób uzyskiwania dostępu do obiektów w kontenerze IoC i wywoływania metod na tych obiektach. Deweloper może wywołać metodę „statycznie” na elewacji, jak na przykład
Request::all()
, ale rzeczywiste wywołanie metody w rzeczywistymIlluminate\Http\Request
obiekcie nie jest statyczne.Fasada działa jak proxy - odwołuje się do obiektu w kontenerze IoC i przekazuje wywołanie metody statycznej do tego obiektu (niestatycznie). Weźmy na przykład
Illuminate\Support\Facades\Request
fasadę, tak to wygląda:class Request extends Facade { protected static function getFacadeAccessor() { return 'request'; } }
W gruncie rzeczy
Illuminate\Support\Facades\Facade
klasa bazowa wykorzystuje trochę magii PHP, a mianowicie__callStatic
metodę:all
bez parametrówgetFacadeAccessor
, w tym przypadkuIlluminate\Http\Request
obiektall
nazywana jest niestatycznie w instancjiIlluminate\Http\Request
.Dlatego, jak @patricus wskazał w swojej odpowiedzi powyżej, zmieniając instrukcję
use
/ import tak, aby odnosiła się do fasady, błędu już nie ma, ponieważ jeśli chodzi o PHP,all
został poprawnie wywołany na instancjiIlluminate\Http\Request
.Aliasing
Aliasing to kolejna funkcja, którą Laravel zapewnia dla wygody. Działa poprzez efektywne tworzenie klas aliasów, które wskazują fasady w głównej przestrzeni nazw. Jeśli spojrzysz na swój
config/app.php
plik, podaliases
kluczem znajdziesz długą listę mapowań ciągów znaków na klasy elewacji. Na przykład:'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 tworzy dla Ciebie te klasy aliasów, w oparciu o Twoją konfigurację, co pozwala na wykorzystanie klas dostępnych w głównej przestrzeni nazw (do których odnoszą się klucze łańcuchowe
aliases
konfiguracji), tak jakbyś używał samej fasady:use Request: class YourController extends Controller { public function yourMethod() { $input = Request::all(); // ... } }
Uwaga na temat wstrzykiwania zależności
Chociaż Laravel nadal udostępnia fasady i aliasy, możliwe jest i zwykle zalecane jest skorzystanie z trasy wstrzykiwania zależności. Na przykład użycie iniekcji konstruktora, aby osiągnąć ten sam wynik:
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(); // ... } }
Takie podejście ma wiele zalet, ale moim osobistym zdaniem największym plusem wstrzykiwania zależności jest to, że ułatwia testowanie kodu. Deklarując zależności twoich klas jako argumenty konstruktora lub metody, bardzo łatwo staje się mockowanie tych zależności i testowanie jednostkowe klasy w izolacji.
źródło
use Illuminate\Http\Request; public function store(Request $request){ dd($request->all()); }
to samo w kontekście powiedzenia
use Request; public function store(){ dd(Request::all()); }
źródło
zdarza się również, gdy importujesz następującą bibliotekę do pliku api.php. dzieje się tak z powodu sugestii niektórych IDE, aby zaimportować go, aby nie znaleźć klasy trasy .
po prostu go usuń i wszystko będzie dobrze działać.
use Illuminate\Routing\Route;
aktualizacja:
wydaje się, że jeśli dodasz tę bibliotekę, nie doprowadzi to do błędu
use Illuminate\Support\Facades\Route;
źródło
Miałem do czynienia z tym problemem nawet z
use Illuminate\Http\Request;
linią na górze mojego kontrolera. Ciągnął za włosy, aż zdałem sobie sprawę, że$request::ip()
zamiast tego robię$request->ip()
. Może się zdarzyć, jeśli nie spałeś całą noc i patrzysz na kod o 6 rano z półotwartymi oczami.Mam nadzieję, że to pomoże komuś w dalszej drodze.
źródło
sprawiam, że działa z definicją zakresu
public function pagar (\ Illuminate \ Http \ Request $ request) {//
źródło