Ich dachte, es wäre nützlich für zukünftige Besucher, eine Erklärung zu geben, was hier passiert.
Die Illuminate\Http\RequestKlasse
Laravels Illuminate\Http\RequestKlasse hat eine Methode namens all(tatsächlich wird die allMethode in einem Merkmal definiert, das die RequestKlasse verwendet, genannt Illuminate\Http\Concerns\InteractsWithInput). Die Signatur der allMethode zum Zeitpunkt des Schreibens sieht folgendermaßen aus:
public function all($keys = null)
Diese Methode ist nicht definiert als staticund wenn Sie versuchen, die Methode in einem statischen Kontext aufzurufen, Illuminate\Http\Request::all()wird der Fehler in der Frage von OP angezeigt. Die allMethode ist eine Instanzmethode und behandelt Informationen, die in einer Instanz der RequestKlasse 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 reale Illuminate\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\Requestwir zum Beispiel die Fassade, so sieht sie aus:
class Request extends Facade
{
protected static function getFacadeAccessor()
{
return 'request';
}
}
Unter der Haube verwendet die Basisklasse Illuminate\Support\Facades\Facadeetwas PHP-Magie, nämlich die __callStaticMethode, um:
- Warten Sie auf einen statischen Methodenaufruf, in diesem Fall
allohne Parameter
- Nehmen Sie das zugrunde liegende Objekt mit dem von
getFacadeAccessor, in diesem Fall einem Illuminate\Http\RequestObjekt, zurückgegebenen Schlüssel aus dem IoC-Container
- Rufen Sie die Methode, die sie statisch für das abgerufene Objekt empfangen hat, dynamisch auf. In diesem Fall
allwird sie für eine Instanz von statisch nicht statisch aufgerufen Illuminate\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 Bezug allauf eine Instanz von korrekt aufgerufen wurde Illuminate\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.phpDatei ansehen , finden Sie unter dem aliasesSchlüssel eine lange Liste von Zuordnungen von Zeichenfolgen zu Fassadenklassen. Beispielsweise:
'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 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 aliasesKonfiguration angegeben), als ob Sie die Fassade selbst verwenden:
use Request:
class YourController extends Controller
{
public function yourMethod()
{
$input = Request::all();
// ...
}
}
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:
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();
// ...
}
}
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.