Dalam LARAVEL, Saya mencoba untuk memanggil $input = Request::all();
pada store()
metode di controller saya, tapi aku mendapatkan error berikut:
Metode non-statis
Illuminate\Http\Request::all()
tidak boleh dipanggil secara statis, dengan asumsi$this
dari konteks yang tidak kompatibel
Adakah bantuan untuk mencari cara terbaik untuk memperbaiki ini? (Saya mengikuti Laracast)
use Illuminate\Http\Request;
pernyataan di pengontrol Anda?Illuminate\Http\Request
paket di / vendor. Apakah saya harus mendownloadnya secara terpisah?Illuminate
paket disertakan sebagai bagian dari paket LARAVEL / framework. Jika Anda ingin melihat salah satu kode sumber Laravel, Anda akan menemukannya di bawah/vendor/laravel/framework/src/Illuminate/...
Jawaban:
Pesan kesalahan ini karena panggilan tidak melalui
Request
fasad.Perubahan
use Illuminate\Http\Request;
Untuk
use Request;
dan itu harus mulai bekerja.
Di file config / app.php, Anda dapat menemukan daftar alias kelas. Di sana, Anda akan melihat bahwa kelas dasar
Request
telah dialiasi denganIlluminate\Support\Facades\Request
kelas tersebut. Karena itu, untuk menggunakanRequest
fasad dalam file namespace, Anda perlu menentukan untuk menggunakan kelas dasar:use Request;
.Edit
Karena pertanyaan ini sepertinya mendapatkan lalu lintas, saya ingin memperbarui jawaban sedikit sejak Laravel 5 secara resmi dirilis.
Meskipun hal di atas masih benar secara teknis dan akan berfungsi,
use Illuminate\Http\Request;
pernyataan tersebut disertakan dalam template Pengontrol baru untuk membantu mendorong pengembang ke arah penggunaan injeksi ketergantungan versus mengandalkan Facade.Saat memasukkan objek Request ke dalam konstruktor (atau metode, seperti yang tersedia di Laravel 5), itu adalah
Illuminate\Http\Request
objek yang harus diinjeksikan, dan bukanRequest
fasadnya.Jadi, daripada mengubah template Controller untuk bekerja dengan Request fasad, lebih baik disarankan untuk bekerja dengan template Controller yang diberikan dan beralih menggunakan injeksi ketergantungan (melalui konstruktor atau metode).
Contoh melalui metode
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class UserController extends Controller { /** * Store a newly created resource in storage. * * @param Illuminate\Http\Request $request * @return Response */ public function store(Request $request) { $name = $request->input('name'); } }
Contoh melalui konstruktor
<?php namespace App\Http\Controllers; use App\Http\Controllers\Controller; use Illuminate\Http\Request; class UserController extends Controller { protected $request; public function __construct(Request $request) { $this->request = $request; } /** * Store a newly created resource in storage. * * @return Response */ public function store() { $name = $this->request->input('name'); } }
sumber
Request::all();
saat saya menggunakanuse Illuminate\Http\Request;
?use Illuminate\Support\Facades\Request;
bukannyause Illuminate\Http\Request;
Masukkan objek permintaan ke dalam pengontrol menggunakan injeksi ajaib Laravel dan kemudian akses fungsinya secara non-statis. Laravel secara otomatis akan memasukkan dependensi konkret ke dalam kelas yang dimuat otomatis
class MyController() { protected $request; public function __construct(\Illuminate\Http\Request $request) { $this->request = $request; } public function myFunc() { $input = $this->request->all(); } }
sumber
gunakan
request()
helper sebagai gantinya. Anda tidak perlu khawatir tentanguse
pernyataan dan dengan demikian masalah semacam ini tidak akan terjadi lagi.sederhana
sumber
Fasad adalah kelas Permintaan lain, akses dengan jalur lengkap:
Dari laravel 5 Anda juga dapat mengaksesnya melalui
request()
fungsi:sumber
Saya pikir akan bermanfaat bagi pengunjung selanjutnya untuk memberikan sedikit penjelasan tentang apa yang terjadi di sini.
The
Illuminate\Http\Request
kelasIlluminate\Http\Request
Kelas Laravel memiliki metode bernamaall
(sebenarnyaall
metode tersebut didefinisikan dalam sifat yangRequest
digunakan kelas, disebutIlluminate\Http\Concerns\InteractsWithInput
). Tanda tanganall
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, yaituIlluminate\Http\Request::all()
Anda akan mendapatkan kesalahan yang ditampilkan dalam pertanyaan OP. Theall
metode adalah metode contoh dan penawaran dengan informasi yang hadir dalam sebuah instance dariRequest
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:all
tanpa parametergetFacadeAccessor
, dalam hal iniIlluminate\Http\Request
objekall
ini disebut non-statis pada instanceIlluminate\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 instanceIlluminate\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 bawahaliases
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.
sumber
use Illuminate\Http\Request; public function store(Request $request){ dd($request->all()); }
sama dalam konteks mengatakan
use Request; public function store(){ dd(Request::all()); }
sumber
juga terjadi ketika Anda mengimpor pustaka berikut ke file api.php. ini terjadi karena beberapa saran IDE untuk mengimpornya karena tidak menemukan Kelas Rute .
hapus saja dan semuanya akan berfungsi dengan baik.
use Illuminate\Routing\Route;
memperbarui:
tampaknya jika Anda menambahkan perpustakaan ini, itu tidak akan menyebabkan kesalahan
use Illuminate\Support\Facades\Route;
sumber
Saya menghadapi masalah ini bahkan dengan
use Illuminate\Http\Request;
garis di bagian atas pengontrol saya. Terus menarik rambut saya sampai saya menyadari bahwa yang saya lakukan,$request::ip()
bukan$request->ip()
. Bisa terjadi pada Anda jika Anda tidak tidur sepanjang malam dan melihat kode jam 6 pagi dengan mata setengah terbuka.Semoga ini membantu seseorang di jalan.
sumber
saya membuatnya bekerja dengan definisi ruang lingkup
pagar fungsi publik (\ Illuminate \ Http \ Request $ request) {//
sumber