Dans Laravel, j'essaie d'appeler $input = Request::all();
une store()
méthode dans mon contrôleur, mais j'obtiens l'erreur suivante:
La méthode non statique
Illuminate\Http\Request::all()
ne doit pas être appelée statiquement, en partant$this
d'un contexte incompatible
Avez-vous de l'aide pour trouver la meilleure façon de corriger cela? (Je suis un Laracast)
use Illuminate\Http\Request;
déclaration dans votre contrôleur?Illuminate\Http\Request
paquet dans / vendor cependant. Dois-je le télécharger séparément?Illuminate
packages sont inclus dans le package laravel / framework. Si vous voulez consulter l'un des codes sources de Laravel, vous le trouverez sous/vendor/laravel/framework/src/Illuminate/...
Réponses:
Le message d'erreur est dû au fait que l'appel ne passe pas par la
Request
façade.Changement
use Illuminate\Http\Request;
À
use Request;
et cela devrait commencer à fonctionner.
Dans le fichier config / app.php, vous pouvez trouver une liste des alias de classe. Là, vous verrez que la classe de base
Request
a été aliasée sur laIlluminate\Support\Facades\Request
classe. À cause de cela, d'utiliser laRequest
façade dans un fichier espaces de noms, vous devez spécifier d'utiliser la classe de base:use Request;
.Éditer
Comme cette question semble générer du trafic, je voulais mettre à jour un peu la réponse depuis la sortie officielle de Laravel 5.
Bien que ce qui précède soit toujours techniquement correct et fonctionnera, l'
use Illuminate\Http\Request;
instruction est incluse dans le nouveau modèle de contrôleur pour aider les développeurs à utiliser l'injection de dépendances plutôt que de s'appuyer sur la façade.Lors de l'injection de l'objet Request dans le constructeur (ou les méthodes, comme disponible dans Laravel 5), c'est l'
Illuminate\Http\Request
objet qui doit être injecté, et non laRequest
façade.Ainsi, au lieu de changer le modèle Controller pour qu'il fonctionne avec la façade Request, il est préférable de travailler avec le modèle Controller donné et de passer à l'utilisation de l'injection de dépendances (via le constructeur ou les méthodes).
Exemple via la méthode
<?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'); } }
Exemple via constructeur
<?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'); } }
la source
Request::all();
pendant que j'utiliseuse Illuminate\Http\Request;
?use Illuminate\Support\Facades\Request;
lieu deuse Illuminate\Http\Request;
Injectez l'objet de requête dans le contrôleur en utilisant l'injection magique de Laravel, puis accédez à la fonction de manière non statique. Laravel injectera automatiquement des dépendances concrètes dans les classes chargées automatiquement
class MyController() { protected $request; public function __construct(\Illuminate\Http\Request $request) { $this->request = $request; } public function myFunc() { $input = $this->request->all(); } }
la source
utilisez
request()
plutôt l' assistant. Vous n'avez pas à vous soucier desuse
déclarations et donc ce genre de problème ne se reproduira plus.Facile
la source
La façade est une autre classe Request, accédez-y avec le chemin complet:
Depuis laravel 5, vous pouvez également y accéder via la
request()
fonction:la source
J'ai pensé qu'il serait utile que les futurs visiteurs fournissent une petite explication sur ce qui se passe ici.
La
Illuminate\Http\Request
classeLa
Illuminate\Http\Request
classe de Laravel a une méthode nomméeall
(en fait laall
méthode est définie dans un trait que laRequest
classe utilise, appeléIlluminate\Http\Concerns\InteractsWithInput
). La signature de laall
méthode au moment de la rédaction ressemble à ceci:public function all($keys = null)
Cette méthode n'est pas définie comme
static
et donc lorsque vous essayez d'appeler la méthode dans un contexte statique, c'est-Illuminate\Http\Request::all()
à- dire que vous obtiendrez l'erreur affichée dans la question de OP. Laall
méthode est une méthode d'instance et traite les informations présentes dans une instance de laRequest
classe, donc l'appeler de cette manière n'a aucun sens.Façades
Une façade dans Laravel fournit aux développeurs un moyen pratique d'accéder aux objets du conteneur IoC et d'appeler des méthodes sur ces objets. Un développeur peut appeler une méthode "statiquement" sur une façade comme
Request::all()
, mais l'appel de méthode réel sur l' objet réelIlluminate\Http\Request
n'est pas statique.Une façade fonctionne comme un proxy - elle fait référence à un objet dans le conteneur IoC et transmet l'appel de méthode statique à cet objet (de manière non statique). Par exemple, prenez la
Illuminate\Support\Facades\Request
façade, voici à quoi elle ressemble:class Request extends Facade { protected static function getFacadeAccessor() { return 'request'; } }
Sous le capot, la
Illuminate\Support\Facades\Facade
classe de base utilise un peu de magie PHP, à savoir la__callStatic
méthode pour:all
sans paramètresgetFacadeAccessor
, dans ce cas, unIlluminate\Http\Request
objetall
est appelé de manière non statique sur une instance deIlluminate\Http\Request
.C'est pourquoi, comme @patricus l'a souligné dans sa réponse ci-dessus, en changeant l'
use
instruction / import pour faire référence à la façade, l'erreur n'est plus là, car en ce qui concerne PHP,all
a été correctement appelée sur une instance deIlluminate\Http\Request
.Aliasing
L'aliasing est une autre fonctionnalité fournie par Laravel pour plus de commodité. Il fonctionne en créant efficacement des classes d'alias qui pointent vers des façades dans l'espace de noms racine. Si vous jetez un œil à votre
config/app.php
fichier, sous laaliases
clé, vous trouverez une longue liste de mappages de chaînes aux classes de façade. Par exemple:'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 crée ces classes d'alias pour vous, en fonction de votre configuration et cela vous permet d'utiliser les classes disponibles dans l'espace de noms racine (comme indiqué par les clés de chaîne de la
aliases
configuration) comme si vous utilisiez la façade elle-même:use Request: class YourController extends Controller { public function yourMethod() { $input = Request::all(); // ... } }
Une note sur l'injection de dépendances
Bien que les façades et l'aliasing soient toujours fournis à Laravel, il est possible et généralement encouragé de suivre la voie d'injection de dépendance. Par exemple, en utilisant l'injection de constructeur pour obtenir le même résultat:
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(); // ... } }
Il y a un certain nombre d'avantages à cette approche, mais à mon avis personnel, le plus grand avantage de l'injection de dépendances est qu'elle rend votre code plus facile à tester. En déclarant les dépendances de vos classes comme arguments de constructeur ou de méthode, il devient très facile de se moquer de ces dépendances et de tester individuellement votre classe.
la source
use Illuminate\Http\Request; public function store(Request $request){ dd($request->all()); }
est la même chose dans le contexte en disant
use Request; public function store(){ dd(Request::all()); }
la source
cela se produit également lorsque vous importez la bibliothèque suivante dans le fichier api.php. cela se produit par la suggestion de certains IDE de l'importer pour ne pas trouver la classe d' itinéraire .
il suffit de le supprimer et tout fonctionnera correctement.
use Illuminate\Routing\Route;
mise à jour:
semble que si vous ajoutez cette bibliothèque, cela ne conduira pas à une erreur
use Illuminate\Support\Facades\Route;
la source
J'étais confronté à ce problème même avec la
use Illuminate\Http\Request;
ligne en haut de mon contrôleur. J'ai continué à me tirer les cheveux jusqu'à ce que je réalise que je faisais à la$request::ip()
place$request->ip()
. Cela peut vous arriver si vous n'avez pas dormi de la nuit et que vous regardez le code à 6 heures du matin avec les yeux entrouverts.J'espère que cela aidera quelqu'un sur la route.
la source
je le fais fonctionner avec une définition de portée
public function pagar (\ Illuminate \ Http \ Request $ request) {//
la source