Ho pensato che sarebbe stato utile per i futuri visitatori fornire un po 'di spiegazione su ciò che sta accadendo qui.
La Illuminate\Http\Request
classe
La Illuminate\Http\Request
classe di Laravel ha un metodo chiamato all
(infatti il all
metodo è definito in un tratto che la Request
classe usa, chiamato Illuminate\Http\Concerns\InteractsWithInput
). La firma del all
metodo al momento della scrittura è simile a questa:
public function all($keys = null)
Questo metodo non è definito come static
e così quando provi a chiamare il metodo in un contesto statico, cioè Illuminate\Http\Request::all()
otterrai l'errore visualizzato nella domanda di OP. Il all
metodo è un metodo di istanza e si occupa delle informazioni presenti in un'istanza della Request
classe, quindi chiamarlo in questo modo non ha senso.
Facciate
Una facciata in Laravel fornisce agli sviluppatori un modo conveniente per accedere agli oggetti nel contenitore IoC e chiamare metodi su tali oggetti. Uno sviluppatore può chiamare un metodo "staticamente" su una facciata simile Request::all()
, ma la chiamata al metodo effettiva Illuminate\Http\Request
sull'oggetto reale non è statica.
Una facciata funziona come un proxy: fa riferimento a un oggetto nel contenitore IoC e passa la chiamata al metodo statico su quell'oggetto (non staticamente). Ad esempio, prendi la Illuminate\Support\Facades\Request
facciata, ecco come appare:
class Request extends Facade
{
protected static function getFacadeAccessor()
{
return 'request';
}
}
Sotto il cofano, la Illuminate\Support\Facades\Facade
classe base utilizza un po 'di magia PHP, vale a dire il __callStatic
metodo per:
- Ascolta una chiamata al metodo statico, in questo caso
all
senza parametri
- Prendi l'oggetto sottostante dal contenitore IoC usando la chiave restituita da
getFacadeAccessor
, in questo caso un Illuminate\Http\Request
oggetto
- Chiama dinamicamente il metodo che ha ricevuto staticamente sull'oggetto che ha recuperato, in questo caso
all
viene chiamato non staticamente su un'istanza di Illuminate\Http\Request
.
Questo è il motivo per cui, come ha sottolineato @patricus nella sua risposta sopra, cambiando l' use
istruzione / import per riferirsi alla facciata, l'errore non c'è più, perché per quanto riguarda PHP, all
è stato correttamente chiamato su un'istanza di Illuminate\Http\Request
.
Aliasing
L'aliasing è un'altra funzionalità fornita da Laravel per comodità. Funziona creando efficacemente classi alias che puntano a facciate nello spazio dei nomi radice. Se dai un'occhiata al tuo config/app.php
file, sotto la aliases
chiave, troverai un lungo elenco di mappature di stringhe in classi di facciata. Per esempio:
'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 queste classi alias per te, in base alla tua configurazione e questo ti consente di utilizzare le classi disponibili nello spazio dei nomi root (come indicato dalle chiavi stringa della aliases
configurazione) come se stessi usando la facciata stessa:
use Request:
class YourController extends Controller
{
public function yourMethod()
{
$input = Request::all();
}
}
Una nota sull'inserimento delle dipendenze
Sebbene facciate e alias siano ancora forniti in Laravel, è possibile e di solito incoraggiato a seguire il percorso di iniezione delle dipendenze. Ad esempio, utilizzando l'iniezione nel costruttore per ottenere lo stesso risultato:
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();
}
}
Ci sono una serie di vantaggi in questo approccio, ma a mio parere personale il più grande vantaggio per l'inserimento delle dipendenze è che rende il tuo codice più facile da testare. Dichiarando le dipendenze delle tue classi come argomenti del costruttore o del metodo, diventa molto facile deridere quelle dipendenze e testare la tua classe in isolamento.