In Laravel versuche ich, $input = Request::all();
eine store()
Methode in meinem Controller aufzurufen , erhalte jedoch den folgenden Fehler:
Nicht statische Methoden
Illuminate\Http\Request::all()
sollten nicht statisch aufgerufen werden, vorausgesetzt, sie stammen$this
aus einem inkompatiblen Kontext
Hilfe bei der Suche nach dem besten Weg, dies zu korrigieren? (Ich folge einem Laracast)
use Illuminate\Http\Request;
Anweisung in Ihrem Controller?Illuminate\Http\Request
Paket jedoch nicht in / vendor. Muss ich das separat herunterladen?Illuminate
Pakete sind Teil des Laravel / Framework-Pakets. Wenn Sie sich einen der Laravel-Quellcodes ansehen möchten, finden Sie ihn unter/vendor/laravel/framework/src/Illuminate/...
Antworten:
Die Fehlermeldung ist darauf zurückzuführen, dass der Anruf nicht durch die
Request
Fassade geht.Veränderung
Zu
und es sollte anfangen zu arbeiten.
In der Datei config / app.php finden Sie eine Liste der Klassenaliasnamen. Dort sehen Sie, dass die Basisklasse
Request
auf dieIlluminate\Support\Facades\Request
Klasse ausgerichtet ist. Um dieRequest
Fassade in einer Datei mit Namespace zu verwenden, müssen Sie daher angeben, dass die Basisklasse verwendet werden soll :use Request;
.Bearbeiten
Da diese Frage etwas Verkehr zu bekommen scheint, wollte ich die Antwort ein wenig aktualisieren, da Laravel 5 offiziell veröffentlicht wurde.
Obwohl das oben Gesagte technisch immer noch korrekt ist und funktioniert, ist die
use Illuminate\Http\Request;
Anweisung in der neuen Controller-Vorlage enthalten, um Entwickler dabei zu unterstützen, die Abhängigkeitsinjektion zu verwenden, anstatt sich auf die Fassade zu verlassen.Beim Injizieren des Request-Objekts in den Konstruktor (oder in die in Laravel 5 verfügbaren Methoden) sollte das
Illuminate\Http\Request
Objekt injiziert werden und nicht dieRequest
Fassade.Anstatt die Controller-Vorlage so zu ändern, dass sie mit der Request-Fassade funktioniert, ist es besser, mit der angegebenen Controller-Vorlage zu arbeiten und die Abhängigkeitsinjektion (über Konstruktor oder Methoden) zu verwenden.
Beispiel über Methode
Beispiel über Konstruktor
quelle
Request::all();
während ich benutzeuse Illuminate\Http\Request;
?use Illuminate\Support\Facades\Request;
use Illuminate\Http\Request;
Injizieren Sie das Anforderungsobjekt mit Laravels magischer Injektion in den Controller und greifen Sie dann nicht statisch auf die Funktion zu. Laravel fügt automatisch geladene Abhängigkeiten in automatisch geladene Klassen ein
quelle
Verwenden Sie
request()
stattdessen den Helfer. Sie müssen sich keine Gedanken überuse
Aussagen machen und daher wird diese Art von Problem nicht wieder auftreten.einfach
quelle
Die Fassade ist eine weitere Request-Klasse. Greifen Sie mit dem vollständigen Pfad darauf zu:
Von Laravel 5 aus können Sie auch über die
request()
Funktion darauf zugreifen :quelle
Ich dachte, es wäre nützlich für zukünftige Besucher, eine Erklärung zu geben, was hier passiert.
Die
Illuminate\Http\Request
KlasseLaravels
Illuminate\Http\Request
Klasse hat eine Methode namensall
(tatsächlich wird dieall
Methode in einem Merkmal definiert, das dieRequest
Klasse verwendet, genanntIlluminate\Http\Concerns\InteractsWithInput
). Die Signatur derall
Methode zum Zeitpunkt des Schreibens sieht folgendermaßen aus:Diese Methode ist nicht definiert als
static
und wenn Sie versuchen, die Methode in einem statischen Kontext aufzurufen,Illuminate\Http\Request::all()
wird der Fehler in der Frage von OP angezeigt. Dieall
Methode ist eine Instanzmethode und behandelt Informationen, die in einer Instanz derRequest
Klasse vorhanden sind. Daher macht es keinen Sinn, sie auf diese Weise aufzurufen.Fassaden
Eine Fassade in Laravel bietet Entwicklern eine bequeme Möglichkeit, auf Objekte im IoC-Container zuzugreifen und Methoden für diese Objekte aufzurufen. Ein Entwickler kann eine Methode "statisch" an einer Fassade wie
Request::all()
aufrufen, aber der tatsächliche Methodenaufruf für das realeIlluminate\Http\Request
Objekt ist nicht statisch.Eine Fassade funktioniert wie ein Proxy - sie verweist auf ein Objekt im IoC-Container und übergibt den statischen Methodenaufruf an dieses Objekt (nicht statisch). Nehmen
Illuminate\Support\Facades\Request
wir zum Beispiel die Fassade, so sieht sie aus:Unter der Haube verwendet die Basisklasse
Illuminate\Support\Facades\Facade
etwas PHP-Magie, nämlich die__callStatic
Methode, um:all
ohne ParametergetFacadeAccessor
, in diesem Fall einemIlluminate\Http\Request
Objekt, zurückgegebenen Schlüssel aus dem IoC-Containerall
wird sie für eine Instanz von statisch nicht statisch aufgerufenIlluminate\Http\Request
.Aus diesem Grund ist, wie @patricus in seiner obigen Antwort ausgeführt hat
use
, der Fehler nicht mehr vorhanden, wenn die Anweisung / import geändert wird , um auf die Fassade zu verweisen, da PHP in Bezugall
auf eine Instanz von korrekt aufgerufen wurdeIlluminate\Http\Request
.Aliasing
Aliasing ist eine weitere Funktion, die Laravel für mehr Komfort bietet. Dabei werden effektiv Aliasklassen erstellt, die auf Fassaden im Stammnamensraum verweisen. Wenn Sie sich Ihre
config/app.php
Datei ansehen , finden Sie unter demaliases
Schlüssel eine lange Liste von Zuordnungen von Zeichenfolgen zu Fassadenklassen. Beispielsweise:Laravel erstellt diese Aliasklassen basierend auf Ihrer Konfiguration für Sie. Auf diese Weise können Sie Klassen verwenden, die im Root-Namespace verfügbar sind (wie in den Zeichenfolgenschlüsseln der
aliases
Konfiguration angegeben), als ob Sie die Fassade selbst verwenden:Ein Hinweis zur Abhängigkeitsinjektion
Während in Laravel noch Fassaden und Aliasing bereitgestellt werden, ist es möglich und wird normalerweise empfohlen, den Weg der Abhängigkeitsinjektion einzuschlagen. Verwenden Sie beispielsweise die Konstruktorinjektion, um das gleiche Ergebnis zu erzielen:
Dieser Ansatz bietet eine Reihe von Vorteilen, aber meiner persönlichen Meinung nach besteht der größte Vorteil für die Abhängigkeitsinjektion darin, dass Ihr Code einfacher zu testen ist. Indem Sie die Abhängigkeiten Ihrer Klassen als Konstruktor- oder Methodenargumente deklarieren, wird es sehr einfach, diese Abhängigkeiten zu verspotten und Ihre Klasse isoliert zu testen.
quelle
ist das gleiche im Zusammenhang zu sagen
quelle
Es passiert auch, wenn Sie die folgende Bibliothek in die Datei api.php importieren. Dies geschieht durch den Vorschlag einer IDE, sie zu importieren, um die Routenklasse nicht zu finden .
Entfernen Sie es einfach und alles wird gut funktionieren.
aktualisieren:
Wenn Sie diese Bibliothek hinzufügen, führt dies anscheinend nicht zu Fehlern
quelle
Ich hatte dieses Problem sogar mit der
use Illuminate\Http\Request;
Leitung oben auf meinem Controller. Ich zog weiter an meinen Haaren, bis mir klar wurde, dass ich es$request::ip()
stattdessen tat$request->ip()
. Kann Ihnen passieren, wenn Sie die ganze Nacht nicht geschlafen haben und den Code um 6 Uhr morgens mit halb geöffneten Augen betrachten.Hoffe, das hilft jemandem auf der Straße.
quelle
Ich lasse es mit einer Scope-Definition funktionieren
öffentliche Funktion pagar (\ Illuminate \ Http \ Request $ request) {//
quelle