Achei que seria útil para os futuros visitantes darem uma pequena explicação sobre o que está acontecendo aqui.
A Illuminate\Http\Request
classe
A Illuminate\Http\Request
classe do Laravel tem um método chamado all
(na verdade o all
método é definido em uma característica que a Request
classe usa, chamada Illuminate\Http\Concerns\InteractsWithInput
). A assinatura do all
método no momento da escrita se parece com isto:
public function all($keys = null)
Este método não é definido como static
e assim quando você tenta chamar o método em um contexto estático, ou seja, Illuminate\Http\Request::all()
você obterá o erro exibido na pergunta do OP. O all
método é um método de instância e lida com informações que estão presentes em uma instância da Request
classe, portanto, chamá-lo dessa forma não faz sentido.
Fachadas
Uma fachada no Laravel fornece aos desenvolvedores uma maneira conveniente de acessar objetos no container IoC e chamar métodos nesses objetos. Um desenvolvedor pode chamar um método "estaticamente" em uma fachada Request::all()
, mas o método real chama no real Illuminate\Http\Request
objeto não é estática.
Uma fachada funciona como um proxy - ela se refere a um objeto no contêiner IoC e passa a chamada do método estático para esse objeto (não estaticamente). Por exemplo, pegue oIlluminate\Support\Facades\Request
fachada, é assim que se parece:
class Request extends Facade
{
protected static function getFacadeAccessor()
{
return 'request';
}
}
Sob o capô, a Illuminate\Support\Facades\Facade
classe base usa alguma mágica do PHP, a saber, o__callStatic
método para:
- Ouça uma chamada de método estático, neste caso
all
sem parâmetros
- Pegue o objeto subjacente do contêiner IoC usando a chave retornada por
getFacadeAccessor
, neste caso um Illuminate\Http\Request
objeto
- Chame dinamicamente o método que recebeu estaticamente no objeto que recuperou; neste caso,
all
é chamado de forma não estática em uma instância de Illuminate\Http\Request
.
É por isso que, como @patricus apontou em sua resposta acima, ao alterar a use
instrução / import para se referir à fachada, o erro não está mais lá, porque no que diz respeito ao PHP,all
foi corretamente chamado em uma instância de Illuminate\Http\Request
.
Aliasing
Aliasing é outro recurso que o Laravel oferece para sua conveniência. Ele funciona criando classes de alias que apontam para fachadas no namespace raiz. Se você der uma olhada em seu config/app.php
arquivo, sob a aliases
chave, você encontrará uma longa lista de mapeamentos de strings para classes de fachada. Por exemplo:
'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,
O Laravel cria essas classes de alias para você, com base na sua configuração e isso permite que você utilize as classes disponíveis no namespace raiz (como referido pelas chaves de string da aliases
configuração) como se você estivesse usando a própria fachada:
use Request:
class YourController extends Controller
{
public function yourMethod()
{
$input = Request::all();
}
}
Uma nota sobre injeção de dependência
Embora fachadas e aliasing ainda sejam fornecidos no Laravel, é possível e geralmente encorajado a seguir a rota de injeção de dependência. Por exemplo, usando injeção de construtor para obter o mesmo 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();
}
}
Há uma série de benefícios nessa abordagem, mas na minha opinião pessoal, o maior benefício para injeção de dependência é que ela torna o seu código mais fácil de testar. Ao declarar as dependências de suas classes como argumentos de construtor ou método, torna-se muito fácil simular essas dependências e testar a unidade de sua classe isoladamente.