Laravel - periksa apakah permintaan Ajax

97

Saya telah mencoba menemukan cara untuk menentukan panggilan ajax di Laravel tetapi saya tidak menemukan dokumen apa pun tentangnya.

Saya memiliki index()fungsi yang ingin saya tangani secara berbeda berdasarkan sifat permintaan. Pada dasarnya ini adalah metode pengontrol sumber daya yang terikat ke permintaan GET.

public function index()
    {
        if(!$this->isLogin())
            return Redirect::to('login');

        if(isAjax()) // This is what i am needing.
        {
          return $JSON;
        }

        $data = array();
        $data['records'] = $this->table->fetchAll();

        $this->setLayout(compact('data'));
    }

Saya tahu metode lain untuk menentukan permintaan Ajax di PHP tetapi saya ingin sesuatu yang spesifik untuk Laravel.

Terima kasih

Diperbarui:

Saya mencoba menggunakan

 if(Request::ajax())
    {
        echo 'Ajax';
    }

Tetapi saya menerima kesalahan: Non-static method Illuminate\Http\Request::ajax() should not be called statically, assuming $this from incompatible context

Kelas tersebut menunjukkan bahwa ini bukan metode statis.

Raheel
sumber

Jawaban:

192

Mungkin ini membantu. Anda harus merujuk @param

         /**       
         * Display a listing of the resource.
         *
         * @param  Illuminate\Http\Request $request
         * @return Response
         */
        public function index(Request $request)
        {
            if($request->ajax()){
                return "AJAX";
            }
            return "HTTP";
        }
Crack_David
sumber
Kamu benar. Ini akan berfungsi dalam kasus saya karena saya menggunakan namespace Illuminate\Http\Request;di pengontrol saya. Terima kasih
Raheel
1
Anda juga dapat menggunakan "request () -> ajax ()" jika diperlukan
badcom
Saya dapat mengonfirmasi bahwa ini berfungsi di 5.2. Saya menggunakan pembantu request()->ajax()Terima kasih!
cbloss793
22

Untuk memeriksa permintaan ajax, Anda dapat menggunakan if (Request::ajax())

Catatan: Jika Anda menggunakan laravel 5, maka di pengontrol ganti

use Illuminate\Http\Request;

dengan

use Request; 

Saya harap ini akan berhasil.

Jnanaranjan
sumber
21

Anda menggunakan Requestkelas yang salah . Jika Anda ingin menggunakan Facade seperti: Request::ajax()Anda harus mengimpor kelas ini:

use Illuminate\Support\Facades\Request;

Dan tidak Illumiante\Http\Request


Solusi lain akan memasukkan instance dari kelas permintaan nyata:

public function index(Request $request){
    if($request->ajax()){
        return "AJAX";
    }

(Sekarang di sini Anda harus mengimpor Illuminate\Http\Request)

lukasgeiter
sumber
kamu benar. Saya memperbaikinya. Beberapa orang lain memberikan pernyataan penggunaan di atas dan saya tidak melihatnya. Terima kasih :)
Raheel
16

$ request-> wantJson ()

Anda dapat mencoba $request->wantsJson()jika $request->ajax()tidak berhasil

$request->ajax() berfungsi jika pustaka JavaScript Anda menyetel header X-Requested-With HTTP.

Secara default Laravel mengatur header ini di js / bootstrap.js

window.axios = require('axios');

window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

Dalam kasus saya, saya menggunakan kode frontend yang berbeda dan saya harus meletakkan tajuk ini secara manual $request->ajax()agar berfungsi.

Tetapi $request->wantsJson()akan memeriksa kueri axios tanpa perlu header X-Requested-With:

// Determine if the current request is asking for JSON. This checks Content-Type equals application/json.
$request->wantsJson()
// or 
\Request::wantsJson() // not \Illuminate\Http\Request
Илья Зеленько
sumber
9
if(Request::ajax()) 

Sepertinya jawaban yang benar. http://laravel.com/api/5.0/Illuminate/Http/Request.html#method_ajax

Matthew Way
sumber
1
Saya tidak yakin apakah ini yang Anda maksud, tetapi Laravel memanfaatkan pola desain Fasad sehingga panggilan Anda dapat dilakukan seperti metode statis: laravel.com/docs/4.2/facades#facade-class-reference Tautan tersebut menunjukkan daftar Fasad yang digunakan Laravel. Apakah Anda menggunakannya di Controller?
Matthew Way
saya menggunakan pernyataan penggunaan yang salah. maaf Tapi terima kasih untuk gambaran umum Fasad :) Ini informatif.
Raheel
6

Bagi mereka yang bekerja dengan front-end AngularJS , itu tidak menggunakan header Ajax laravel yang diharapkan. ( Baca lebih lanjut )

Gunakan Request :: wantJson () untuk AngularJS:

if(Request::wantsJson()) { 
    // Client wants JSON returned 
}
Justin
sumber
ini harus menjadi jawabannya sekarang
Salal Aslam
6

Mereka yang lebih suka menggunakan helper laravel, mereka dapat memeriksa apakah suatu permintaan adalah ajax menggunakan request()helper laravel .

if(request()->ajax())
   // code
lee shin
sumber
2
public function index()
{
    if(!$this->isLogin())
        return Redirect::to('login');

    if(Request::ajax()) // This is check ajax request
    {
      return $JSON;
    }

    $data = array();
    $data['records'] = $this->table->fetchAll();

    $this->setLayout(compact('data'));
}

sumber
2

Terkadang Request::ajax()tidak berhasil, lalu gunakan\Request::ajax()

Nagibaba
sumber
Ini tidak akan berfungsi jika namespace tidak digunakan. Anyways terima kasih
Raheel
0

setelah menulis kode jquery, lakukan validasi ini di rute Anda atau di pengontrol.

$.ajax({
url: "/id/edit",
data:
name:name,
method:'get',
success:function(data){
  console.log(data);}
});

Route::get('/', function(){
if(Request::ajax()){
  return 'it's ajax request';}
});
Muhammad Awais
sumber