Laravel la Demande: tous les() ne Devraient Pas Être Appelée de façon Statique
Dans Laravel, je vais essayer d'appeler $input = Request::all();
sur un store()
méthode dans mon contrôleur, mais j'obtiens l'erreur suivante:
Non méthode statique
Illuminate\Http\Request::all()
ne devraient pas être appelée de façon statique, en supposant$this
de contexte incompatible
Toute aide à trouver le meilleur moyen de corriger cela? (Je suis en suivant une Laracast)
- Laravel 4 ou 5?
- désolé, j'aurais dit 5.
- Il semble que vous n'êtes pas à l'aide de la façade. Avez-vous un
use Illuminate\Http\Request;
déclaration dans votre contrôleur? - J'ai " l'utilisation d'Éclairer\Http\Request; déclaration du haut de mon contrôleur.
- Je n'ai pas le
Illuminate\Http\Request
paquet dans /vendeur si. Dois-je télécharger séparément? - Le
Illuminate
paquets sont inclus en tant que partie de la laravel/cadre de package. Si vous souhaitez consulter la Laravel code source, vous le trouverez sous/vendor/laravel/framework/src/Illuminate/...
- Vous devez utiliser le constructeur de l'injection ou de l'objet de Requête sur les appels statiques. Il y a également défini pour l'instant la migration de votre code vers DI: tomasvotruba.cz/blog/2019/03/04/...
Vous devez vous connecter pour publier un commentaire.
Le message d'erreur est dû à l'appel ne passe pas par la
Request
façade.Changement
À
et il devrait commencer à travailler.
Dans le config/app.php fichier, vous pouvez trouver une liste de la classe des alias. Là, vous verrez que la classe de base
Request
a été un alias pour l'Illuminate\Support\Facades\Request
classe. De ce fait, l'utilisation de laRequest
façade dans un espace de noms de fichier, vous devez spécifier l'utilisation de la classe de base:use Request;
.Modifier
Depuis que cette question semble pour obtenir un peu de trafic, je voulais mettre à jour la réponse un peu depuis Laravel 5 a été officiellement publié.
Alors que le ci-dessus est encore techniquement correcte et au travail, l'
use Illuminate\Http\Request;
déclaration est incluse dans le nouveau modèle du Contrôleur pour aider à pousser les développeurs dans le sens de l'utilisation de l'injection de dépendance par rapport à dépendre de la Façade.Lors de l'injection de la Demande objet dans le constructeur (ou méthodes disponibles dans Laravel 5), c'est le
Illuminate\Http\Request
objet qui doit être injecté, et pas leRequest
façade.Donc, au lieu de changer le modèle du Contrôleur de travailler avec la Demande de la façade, il est préférable conseillé de travailler avec le modèle du Contrôleur et de la déplacer vers l'utilisation de l'injection de dépendance (via le constructeur ou les méthodes).
Exemple via la méthode
Exemple via le constructeur
Request::all();
alors que j'utiliseuse Illuminate\Http\Request;
?use Illuminate\Support\Facades\Request;
au lieu deuse Illuminate\Http\Request;
Request
objet injecté dans le contrôleur de l'objet réel, pas une façade. Ainsi, vous souhaitez simplement utiliser$input = $this->request->all();
.Injecter de l'objet de la requête dans le contrôleur à l'aide de Laravel la magie de l'injection, puis accéder à la fonction non-statique. Laravel automatiquement injecter du béton de dépendances dans chargées automatiquement les classes
utiliser le
request()
helper à la place. Vous n'avez pas à vous soucier deuse
états et donc ce genre de problème n'arrivera jamais à nouveau.simple
La façade est d'une autre Demande de la classe, de l'accès avec le chemin d'accès complet:
De laravel 5, vous pouvez également y accéder par le biais de la
request()
fonction:J'ai pensé qu'il serait utile pour les futurs visiteurs à fournir un peu d'explication sur ce qui se passe ici.
La
Illuminate\Http\Request
classeLaravel est
Illuminate\Http\Request
classe a une méthode nomméeall
(en fait, laall
méthode est définie dans un trait de caractère qui leRequest
classe utilise, appeléIlluminate\Http\Concerns\InteractsWithInput
). La signature de laall
méthode au moment de l'écriture ressemble à ceci:Cette méthode n'est pas définie comme
static
et donc, quand vous essayez d'appeler la méthode dans un contexte statique, c'est à direIlluminate\Http\Request::all()
vous recevrez le message d'erreur affiché à l'OP de la question. Leall
est une méthode d'instance et traite de l'information qui est présente dans une instance de laRequest
classe, afin de l'appeler de cette façon n'a pas de sens.Façades
Une façade dans Laravel fournit aux développeurs un moyen pratique d'accéder à des objets dans le conteneur IoC, et des appels de méthodes sur ces objets. Un développeur peut appeler une méthode "statique" sur une façade comme
Request::all()
, mais la méthode d'appel sur le réelIlluminate\Http\Request
objet est pas statique.Une façade fonctionne comme un proxy - il se réfère à un objet dans le conteneur IoC et passe à la statique de l'appel de méthode sur un objet (non statique). Par exemple, prenez la
Illuminate\Support\Facades\Request
façade, c'est à quoi il ressemble:Sous le capot, la base
Illuminate\Support\Facades\Facade
classe utilise du PHP magique, à savoir la__callStatic
méthode:all
sans paramètresgetFacadeAccessor
, dans ce cas, unIlluminate\Http\Request
objetall
est appelé non-statiquement sur une instance deIlluminate\Http\Request
.C'est pourquoi, comme @patricus l'a souligné dans sa réponse ci-dessus, en changeant la
use
/instruction import pour se référer à la façade, l'erreur n'est plus là, parce que pour ce que PHP est concerné,all
a été correctement appelée sur une instance deIlluminate\Http\Request
.Aliasing
Aliasing est une autre caractéristique que Laravel fournit pour plus de commodité. Il fonctionne en créant des alias classes de ce point de façades dans l'espace de noms racine. Si vous jetez un oeil à votre
config/app.php
fichier, en vertu de laaliases
clé, vous trouverez une longue liste de correspondances de chaînes à la façade classes. Par exemple:Laravel crée ces alias classes pour vous, en fonction de votre configuration et cela vous permet d'utiliser des classes disponibles dans l'espace de noms racine (visée par la chaîne des clés de la
aliases
config) comme si vous êtes à l'aide de la façade elle-même:Une note sur l'injection de dépendance
Tandis que les façades et l'aliasing sont toujours fournis dans Laravel, il est possible et généralement encouragés à aller en bas de l'injection de dépendance route. Par exemple, à l'aide du constructeur d'injection pour obtenir le même résultat:
Il y a un certain nombre d'avantages à cette approche, mais à mon avis, le plus grand pro pour l'injection de dépendances est que cela rend votre code plus facile à tester. En déclarant les dépendances de vos classes en tant que constructeur ou des arguments de méthode, il devient très facile de se moquer de ces dépendances et de l'unité de test de votre classe dans l'isolement.
est même dans le contexte disant
J'ai été confronté à ce problème, même avec
use Illuminate\Http\Request;
ligne en haut de mon contrôleur. Continuait de tirer mes cheveux jusqu'à ce que j'ai réalisé que je faisais$request::ip()
au lieu de$request->ip()
. Peut vous arriver si vous n'avez pas dormir toute la nuit et sont en regardant le code à 6h du matin avec les yeux entrouverts.Espère que cela aide quelqu'un en bas de la route.
je le faire fonctionner avec une définition de la portée
fonction publique pagar(\Éclairer\Http\Request $request)
{
//