Pensé que sería útil para los futuros visitantes dar una pequeña explicación sobre lo que está sucediendo aquí.
La Illuminate\Http\Requestclase
La Illuminate\Http\Requestclase de Laravel tiene un método llamado all(de hecho, el allmétodo está definido en un rasgo que Requestusa la clase, llamado Illuminate\Http\Concerns\InteractsWithInput). La firma del allmétodo en el momento de escribir este artículo se ve así:
public function all($keys = null)
Este método no se define como staticy, 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 allmétodo es un método de instancia y trata con información que está presente en una instancia de la Requestclase, 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\Requestfachada, así es como se ve:
class Request extends Facade
{
protected static function getFacadeAccessor()
{
return 'request';
}
}
Bajo el capó, la Illuminate\Support\Facades\Facadeclase base usa algo de magia PHP, es decir, el __callStaticmétodo para:
- Escuche una llamada a un método estático, en este caso
allsin parámetros
- Agarre el objeto subyacente del contenedor de IoC utilizando la clave devuelta por
getFacadeAccessor, en este caso un Illuminate\Http\Requestobjeto
- Llame dinámicamente al método que recibió estáticamente en el objeto que ha recuperado, en este caso
allse 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 usedeclaración / import para hacer referencia a la fachada, el error ya no está allí, porque en lo que respecta a PHP, allse 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.phparchivo, debajo de la aliasesclave, 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 aliasesconfiguració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.