Saya pikir akan bermanfaat bagi pengunjung selanjutnya untuk memberikan sedikit penjelasan tentang apa yang terjadi di sini.
The Illuminate\Http\Requestkelas
Illuminate\Http\RequestKelas Laravel memiliki metode bernama all(sebenarnya allmetode tersebut didefinisikan dalam sifat yang Requestdigunakan kelas, disebut Illuminate\Http\Concerns\InteractsWithInput). Tanda tangan allmetode pada saat penulisan terlihat seperti ini:
public function all($keys = null)
Metode ini tidak didefinisikan sebagai staticdan jadi ketika Anda mencoba memanggil metode dalam konteks statis, yaitu Illuminate\Http\Request::all()Anda akan mendapatkan kesalahan yang ditampilkan dalam pertanyaan OP. The allmetode adalah metode contoh dan penawaran dengan informasi yang hadir dalam sebuah instance dari Requestkelas, sehingga menyebutnya dengan cara ini tidak masuk akal.
Fasad
Fasad di Laravel memberi pengembang cara yang nyaman untuk mengakses objek dalam wadah IoC, dan memanggil metode pada objek tersebut. Pengembang dapat memanggil metode "secara statis" pada fasad seperti itu Request::all(), tetapi pemanggilan metode aktual pada objek nyata tidak statis.Illuminate\Http\Request
Fasad berfungsi seperti proxy - ia merujuk ke objek dalam wadah IoC dan meneruskan panggilan metode statis ke objek itu (non-statis). Misalnya, ambil Illuminate\Support\Facades\Requestfasadnya, seperti ini:
class Request extends Facade
{
protected static function getFacadeAccessor()
{
return 'request';
}
}
Di bawah tenda, Illuminate\Support\Facades\Facadekelas dasar menggunakan beberapa sihir PHP, yaitu __callStaticmetode untuk:
- Dengarkan panggilan metode statis, dalam hal ini
alltanpa parameter
- Ambil objek yang mendasari dari kontainer IoC menggunakan kunci yang dikembalikan oleh
getFacadeAccessor, dalam hal ini Illuminate\Http\Requestobjek
- Panggil secara dinamis metode yang diterimanya secara statis pada objek yang diambilnya, dalam hal
allini disebut non-statis pada instance Illuminate\Http\Request.
Inilah sebabnya, seperti yang ditunjukkan @patricus dalam jawabannya di atas, dengan mengubah pernyataan use/ import untuk merujuk ke fasad, kesalahan tidak lagi ada, karena sejauh menyangkut PHP, alltelah dipanggil dengan benar pada instance Illuminate\Http\Request.
Aliasing
Aliasing adalah fitur lain yang disediakan Laravel untuk kenyamanan. Ia bekerja dengan secara efektif membuat kelas alias yang mengarah ke fasad di namespace root. Jika Anda melihat config/app.phpfile Anda , di bawah aliaseskunci, Anda akan menemukan daftar panjang pemetaan string untuk kelas fasad. Sebagai contoh:
'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 membuat kelas alias ini untuk Anda, berdasarkan konfigurasi Anda dan ini memungkinkan Anda untuk menggunakan kelas yang tersedia di namespace root (seperti yang dirujuk oleh kunci string dari aliaseskonfigurasi) seolah-olah Anda menggunakan fasad itu sendiri:
use Request:
class YourController extends Controller
{
public function yourMethod()
{
$input = Request::all();
}
}
Catatan tentang injeksi ketergantungan
Meskipun fasad dan aliasing masih tersedia di Laravel, hal ini memungkinkan dan biasanya didorong untuk mengikuti rute injeksi ketergantungan. Misalnya, menggunakan injeksi konstruktor untuk mencapai hasil yang sama:
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();
}
}
Ada sejumlah manfaat dari pendekatan ini, tetapi menurut pendapat pribadi saya pro terbesar untuk injeksi ketergantungan adalah membuat kode Anda lebih mudah untuk diuji. Dengan mendeklarasikan dependensi kelas Anda sebagai konstruktor atau argumen metode, menjadi sangat mudah untuk memalsukan dependensi tersebut dan menguji unit kelas Anda secara terpisah.