php - for - request laravel
Laravel Request:: all() no debe llamarse estáticamente (8)
El mensaje de error se debe a que la llamada no atraviesa la fachada de
Request
.
Cambio
use Illuminate/Http/Request;
A
use Request;
y debería comenzar a funcionar.
En el archivo config / app.php, puede encontrar una lista de los alias de clase.
Allí, verá que la
Request
clase base se ha alias a la clase
Illuminate/Support/Facades/Request
.
Debido a esto, para usar la fachada
Request
en un archivo de espacio de nombres, debe especificar el uso de la clase base:
use Request;
.
Editar
Como esta pregunta parece tener algo de tráfico, quería actualizar un poco la respuesta desde que se lanzó oficialmente Laravel 5.
Si bien lo anterior sigue siendo técnicamente correcto y funcionará,
use Illuminate/Http/Request;
La declaración se incluye en la nueva plantilla de Controlador para ayudar a los desarrolladores a utilizar la inyección de dependencia en lugar de confiar en la Fachada.
Al inyectar el objeto Solicitud en el constructor (o métodos, como están disponibles en Laravel 5), es el objeto
Illuminate/Http/Request
que se debe inyectar, y no la fachada
Request
.
Por lo tanto, en lugar de cambiar la plantilla del Controlador para que funcione con la fachada de Solicitud, se recomienda trabajar con la plantilla del Controlador dada y avanzar hacia el uso de la inyección de dependencia (a través de un constructor o métodos).
Ejemplo por método
<?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'');
}
}
Ejemplo vía constructor
<?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'');
}
}
En Laravel, intento llamar a
$input = Request::all();
en un método
store()
en mi controlador, pero obtengo el siguiente error:
El método no estático
Illuminate/Http/Request::all()
no debe llamarse estáticamente, suponiendo$this
desde un contexto incompatible
¿Alguna ayuda para descubrir la mejor manera de corregir esto? (Estoy siguiendo un Laracast)
Estaba enfrentando este problema incluso con el
use Illuminate/Http/Request;
línea en la parte superior de mi controlador.
Seguí tirando de mi cabello hasta que me di cuenta de que estaba haciendo
$request::ip()
lugar de
$request->ip()
.
Puede sucederle si no durmió toda la noche y mira el código a las 6 de la mañana con los ojos entreabiertos.
Espero que esto ayude a alguien en el camino.
Inyecte el objeto de solicitud en el controlador utilizando la inyección mágica de Laravel y luego acceda a la función de forma no estática. Laravel inyectará automáticamente dependencias concretas en clases cargadas automáticamente
class MyController()
{
protected $request;
public function __construct(/Illuminate/Http/Request $request)
{
$this->request = $request;
}
public function myFunc()
{
$input = $this->request->all();
}
}
La fachada es otra clase de solicitud, acceda con la ruta completa:
$input = request()->all();
Desde laravel 5 también puede acceder a través de la función
request()
:
$input = request()->all();
Pensé que sería útil para los futuros visitantes dar un poco de explicación sobre lo que está sucediendo aquí.
La clase
Illuminate/Http/Request
La clase
Illuminate/Http/Request
Laravel tiene un método llamado
all
(de hecho, el método
all
se define en un rasgo que usa la clase
Request
, llamado
Illuminate/Http/Concerns/InteractsWithInput
).
La firma del método
all
al momento de escribir se ve así:
use Illuminate/Http/Request;
public function store(Request $request){
dd($request->all());
}
Este método no se define como
static
y, por lo tanto, cuando intente llamar al método en un contexto estático, es decir,
Illuminate/Http/Request::all()
obtendrá el error que se muestra en la pregunta de OP.
El método
all
es un método de instancia y trata la información que está presente en una instancia de la clase
Request
, por lo que llamarlo de esta manera no tiene sentido.
Fachadas
Una fachada en Laravel proporciona a los desarrolladores una forma conveniente de acceder a objetos en el contenedor de IoC y llamar a métodos sobre esos objetos.
Un desarrollador puede llamar a un método "estáticamente" en una fachada como
Request::all()
, pero la llamada al método real en el objeto
real
Illuminate/Http/Request
no
es estático.
Una fachada funciona como un proxy: se refiere a un objeto en el contenedor de IoC y pasa la llamada al método estático sobre ese objeto (no estáticamente).
Por ejemplo, tome la fachada
Illuminate/Support/Facades/Request
, así es como se ve:
use Request;
public function store(){
dd(Request::all());
}
Debajo del capó, la clase base
Illuminate/Support/Facades/Facade
utiliza algo de magia PHP, a saber, el método
__callStatic
para:
-
Escuche una llamada de método estático, en este caso,
all
sin parámetros -
Tome el objeto subyacente del contenedor IoC con la clave devuelta por
getFacadeAccessor
, en este caso un objetoIlluminate/Http/Request
-
Llame dinámicamente al método que recibió estáticamente en el objeto que ha recuperado, en este caso,
all
se llama de forma no estática en una instancia deIlluminate/Http/Request
.
Es por eso que, como señaló @patricus en su respuesta anterior, al cambiar la declaración de
use
/ importación para referirse a la fachada, el error ya no está allí, porque en lo que respecta a PHP,
all
se ha llamado correctamente en una instancia de
Illuminate/Http/Request
.
Aliasing
El alias es otra característica que Laravel proporciona para mayor comodidad.
Funciona creando efectivamente clases de alias que apuntan a fachadas en el espacio de nombres raíz.
Si echa un vistazo a su archivo
config/app.php
, debajo de la clave de
aliases
, encontrará una larga lista de asignaciones de cadenas a clases de fachada.
Por ejemplo:
public function all($keys = null)
Laravel crea estas clases de alias para usted, en función de su configuración y esto le permite utilizar las clases disponibles en el espacio de nombres raíz (como se hace referencia en las teclas de cadena de la configuración de
aliases
) como si estuviera usando la fachada misma:
class Request extends Facade
{
protected static function getFacadeAccessor()
{
return ''request'';
}
}
Una nota sobre la inyección de dependencia
Si bien todavía se proporcionan fachadas y alias en Laravel, es posible y generalmente se recomienda seguir la ruta de inyección de dependencia. Por ejemplo, usando la inyección del constructor para lograr el mismo resultado:
''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,
Existen varios beneficios para este enfoque, pero en mi opinión personal, el mejor profesional para la inyección de dependencia es que hace que su código sea más fácil de probar. Al declarar las dependencias de sus clases como argumentos de constructor o método, se vuelve muy fácil burlarse de esas dependencias y probar su clase de forma aislada.
lo hago funcionar con una definición de alcance
función pública pagar (/ Illuminate / Http / Request $ request) {//
use el asistente
request()
lugar.
No tiene que preocuparse por las declaraciones de
use
y, por lo tanto, este tipo de problema no volverá a ocurrir.
$input = /Request::all();
sencillo
use Request:
class YourController extends Controller
{
public function yourMethod()
{
$input = Request::all();
// ...
}
}
es lo mismo en contexto diciendo
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();
// ...
}
}