Ho pensato che sarebbe stato utile per i futuri visitatori fornire un po 'di spiegazione su ciò che sta accadendo qui.
La Illuminate\Http\Requestclasse
La Illuminate\Http\Requestclasse di Laravel ha un metodo chiamato all(infatti il allmetodo è definito in un tratto che la Requestclasse usa, chiamato Illuminate\Http\Concerns\InteractsWithInput). La firma del allmetodo al momento della scrittura è simile a questa:
public function all($keys = null)
Questo metodo non è definito come statice 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 allmetodo è un metodo di istanza e si occupa delle informazioni presenti in un'istanza della Requestclasse, 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\Requestfacciata, ecco come appare:
class Request extends Facade
{
protected static function getFacadeAccessor()
{
return 'request';
}
}
Sotto il cofano, la Illuminate\Support\Facades\Facadeclasse base utilizza un po 'di magia PHP, vale a dire il __callStaticmetodo per:
- Ascolta una chiamata al metodo statico, in questo caso
allsenza parametri
- Prendi l'oggetto sottostante dal contenitore IoC usando la chiave restituita da
getFacadeAccessor, in questo caso un Illuminate\Http\Requestoggetto
- Chiama dinamicamente il metodo che ha ricevuto staticamente sull'oggetto che ha recuperato, in questo caso
allviene 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' useistruzione / 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.phpfile, sotto la aliaseschiave, 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 aliasesconfigurazione) 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.