Laravel - ตรวจสอบว่าคำขอ Ajax หรือไม่


104

ฉันพยายามหาวิธีกำหนดการโทรของ ajax ใน Laravel แต่ไม่พบเอกสารใด ๆ เกี่ยวกับเรื่องนี้

ฉันมีindex()ฟังก์ชันที่ฉันต้องการจัดการสถานการณ์ที่แตกต่างกันไปตามลักษณะของคำขอ โดยทั่วไปนี่เป็นวิธีการควบคุมทรัพยากรที่เชื่อมโยงกับคำขอ 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'));
    }

ฉันรู้วิธีอื่น ๆ ในการพิจารณาคำขอ Ajax ใน PHP แต่ฉันต้องการบางอย่างเฉพาะสำหรับ Laravel

ขอบคุณ

อัปเดต:

ฉันลองใช้

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

แต่ฉันได้รับข้อผิดพลาด: Non-static method Illuminate\Http\Request::ajax() should not be called statically, assuming $this from incompatible context

คลาสแสดงให้เห็นว่านี่ไม่ใช่วิธีการคงที่

คำตอบ:


206

บางทีนี่อาจช่วยได้ คุณต้องอ้างอิง @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";
        }

คุณพูดถูก สิ่งนี้จะใช้ได้ในกรณีของฉันเนื่องจากฉันใช้เนมสเปซIlluminate\Http\Request;ในคอนโทรลเลอร์ของฉัน ขอบคุณ
Raheel

1
คุณยังสามารถใช้ "request () -> ajax ()" ได้หากจำเป็น
badcom

ฉันสามารถยืนยันสิ่งนี้ได้ใน 5.2 ฉันใช้ตัวช่วยแล้วrequest()->ajax()ขอบคุณ!
cbloss793

23

ในการตรวจสอบคำขอ ajax คุณสามารถใช้ if (Request::ajax())

หมายเหตุ: หากคุณใช้ laravel 5 ให้แทนที่คอนโทรลเลอร์ในคอนโทรลเลอร์

use Illuminate\Http\Request;

ด้วย

use Request; 

ฉันหวังว่ามันจะได้ผล


22

คุณใช้ผิดRequestชั้น หากคุณต้องการใช้ Facade เช่น: Request::ajax()คุณต้องนำเข้าคลาสนี้:

use Illuminate\Support\Facades\Request;

และไม่ Illumiante\Http\Request


อีกวิธีหนึ่งคือการฉีดอินสแตนซ์ของคลาสคำขอจริง:

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

(ตอนนี้คุณต้องนำเข้าที่นี่Illuminate\Http\Request)


คุณพูดถูก ฉันได้รับการแก้ไขแล้ว ผู้ชายคนอื่นบางคนใส่คำสั่งการใช้งานไว้ข้างบนและฉันไม่ได้ดูที่ ขอบคุณ :)
Raheel

16

$ request-> wantJson ()

คุณสามารถลอง$request->wantsJson()ถ้า$request->ajax()ไม่ได้ผล

$request->ajax() ทำงานได้ถ้าไลบรารี JavaScript ของคุณตั้งค่าส่วนหัว X-Requested-With HTTP

โดยค่าเริ่มต้น Laravel จะตั้งค่าส่วนหัวนี้ใน js / bootstrap.js

window.axios = require('axios');

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

ในกรณีของฉันฉันใช้รหัสส่วนหน้าอื่นและฉันต้องใส่ส่วนหัวนี้ด้วยตนเองเพื่อ$request->ajax()ให้ทำงานได้

แต่$request->wantsJson()จะตรวจสอบการสืบค้น axios โดยไม่จำเป็นต้องมีส่วนหัว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

10
if(Request::ajax()) 

ดูจะเป็นคำตอบที่ใช่ http://laravel.com/api/5.0/Illuminate/Http/Request.html#method_ajax


1
ฉันไม่แน่ใจว่านี่คือสิ่งที่คุณหมายถึงหรือไม่ แต่ Laravel ใช้รูปแบบการออกแบบ Facade เพื่อให้การโทรของคุณสามารถทำได้เหมือนวิธีการคงที่: laravel.com/docs/4.2/facades#facade-class-referenceลิงก์นั้นแสดง รายการ Facades Laravel ใช้ คุณใช้มันในคอนโทรลเลอร์หรือไม่?
Matthew Way

ฉันใช้คำสั่งใช้ผิด ขออภัย แต่ขอบคุณสำหรับภาพรวมของ Facades :) นี่เป็นข้อมูล
Raheel


6

ผู้ที่ต้องการใช้ตัวช่วย laravel สามารถตรวจสอบได้ว่าคำขอเป็น ajax โดยใช้ตัวrequest()ช่วยlaravel หรือไม่

if(request()->ajax())
   // code

3
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'));
}

3

บางครั้งใช้Request::ajax()ไม่ได้ก็ใช้\Request::ajax()


จะไม่ทำงานหากไม่ได้ใช้เนมสเปซ ยังไงก็ตามขอบคุณ
ฮีล

0

หลังจากเขียนโค้ด jquery แล้วให้ทำการตรวจสอบความถูกต้องนี้ในเส้นทางของคุณหรือในคอนโทรลเลอร์

$.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';}
});

0

คำตอบส่วนใหญ่ใช้งานได้ดี นอกจากนี้เรายังสามารถตรวจสอบส่วนหัวของคำขอ

request()->header('Accept')=='application/json'

เพื่อตรวจสอบประเภทคำขอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.