Saya pikir akan bermanfaat bagi pengunjung selanjutnya untuk memberikan sedikit penjelasan tentang apa yang terjadi di sini.
The Illuminate\Http\Request
kelas
Illuminate\Http\Request
Kelas Laravel memiliki metode bernama all
(sebenarnya all
metode tersebut didefinisikan dalam sifat yang Request
digunakan kelas, disebut Illuminate\Http\Concerns\InteractsWithInput
). Tanda tangan all
metode pada saat penulisan terlihat seperti ini:
public function all($keys = null)
Metode ini tidak didefinisikan sebagai static
dan jadi ketika Anda mencoba memanggil metode dalam konteks statis, yaitu Illuminate\Http\Request::all()
Anda akan mendapatkan kesalahan yang ditampilkan dalam pertanyaan OP. The all
metode adalah metode contoh dan penawaran dengan informasi yang hadir dalam sebuah instance dari Request
kelas, 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\Request
fasadnya, seperti ini:
class Request extends Facade
{
protected static function getFacadeAccessor()
{
return 'request';
}
}
Di bawah tenda, Illuminate\Support\Facades\Facade
kelas dasar menggunakan beberapa sihir PHP, yaitu __callStatic
metode untuk:
- Dengarkan panggilan metode statis, dalam hal ini
all
tanpa parameter
- Ambil objek yang mendasari dari kontainer IoC menggunakan kunci yang dikembalikan oleh
getFacadeAccessor
, dalam hal ini Illuminate\Http\Request
objek
- Panggil secara dinamis metode yang diterimanya secara statis pada objek yang diambilnya, dalam hal
all
ini 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, all
telah 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.php
file Anda , di bawah aliases
kunci, 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 aliases
konfigurasi) 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.