index for create content ciclo php laravel laravel-5

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 objeto Illuminate/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 de Illuminate/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(); // ... } }