Pensé que sería útil para los futuros visitantes dar una pequeña explicación sobre lo que está sucediendo aquí.
La Illuminate\Http\Request
clase
La Illuminate\Http\Request
clase de Laravel tiene un método llamado all
(de hecho, el all
método está definido en un rasgo que Request
usa la clase, llamado Illuminate\Http\Concerns\InteractsWithInput
). La firma del all
método en el momento de escribir este artículo se ve así:
public function all($keys = null)
Este método no se define como static
y, por lo tanto, cuando intenta 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 all
método es un método de instancia y trata con información que está presente en una instancia de la Request
clase, 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 en 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 noIlluminate\Http\Request
es estática.
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 a ese objeto (de forma no estática). Por ejemplo, tome la Illuminate\Support\Facades\Request
fachada, así es como se ve:
class Request extends Facade
{
protected static function getFacadeAccessor()
{
return 'request';
}
}
Bajo el capó, la Illuminate\Support\Facades\Facade
clase base usa algo de magia PHP, es decir, el __callStatic
método para:
- Escuche una llamada a un método estático, en este caso
all
sin parámetros
- Agarre el objeto subyacente del contenedor de IoC utilizando la clave devuelta por
getFacadeAccessor
, en este caso un Illuminate\Http\Request
objeto
- 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 @patricus señaló en su respuesta anterior, al cambiar la use
declaración / import para hacer referencia 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
La creación de 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 config/app.php
archivo, debajo de la aliases
clave, encontrará una larga lista de asignaciones de cadenas a clases de fachada. Por ejemplo:
'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 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 indica en las claves de cadena de la aliases
configuración) como si estuviera usando la propia fachada:
use Request:
class YourController extends Controller
{
public function yourMethod()
{
$input = Request::all();
}
}
Una nota sobre la inyección de dependencia
Si bien las fachadas y el aliasing todavía se proporcionan 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:
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();
}
}
Hay una serie de beneficios en este enfoque, pero en mi opinión personal, la mayor ventaja de 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, resulta muy fácil simular esas dependencias y realizar pruebas unitarias en su clase de forma aislada.