Ich dachte, es wäre nützlich für zukünftige Besucher, eine Erklärung zu geben, was hier passiert.
Die Illuminate\Http\Request
Klasse
Laravels Illuminate\Http\Request
Klasse hat eine Methode namens all
(tatsächlich wird die all
Methode in einem Merkmal definiert, das die Request
Klasse verwendet, genannt Illuminate\Http\Concerns\InteractsWithInput
). Die Signatur der all
Methode zum Zeitpunkt des Schreibens sieht folgendermaßen aus:
public function all($keys = null)
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. Die all
Methode ist eine Instanzmethode und behandelt Informationen, die in einer Instanz der Request
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 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\Request
wir 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\Facade
etwas PHP-Magie, nämlich die __callStatic
Methode, um:
- Warten Sie auf einen statischen Methodenaufruf, in diesem Fall
all
ohne Parameter
- Nehmen Sie das zugrunde liegende Objekt mit dem von
getFacadeAccessor
, in diesem Fall einem Illuminate\Http\Request
Objekt, 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
all
wird 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 all
auf 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.php
Datei ansehen , finden Sie unter dem aliases
Schlü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 aliases
Konfiguration 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.