Laravel - kiểm tra xem có yêu cầu Ajax không


95

Tôi đã cố gắng tìm cách xác định lệnh gọi ajax trong Laravel nhưng tôi không tìm thấy bất kỳ tài liệu nào liên quan đến nó.

Tôi có một index()chức năng mà tôi muốn xử lý tình huống khác nhau dựa trên bản chất của yêu cầu. Về cơ bản, đây là một phương thức điều khiển tài nguyên được ràng buộc với yêu cầu 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'));
    }

Tôi biết các phương pháp khác để xác định yêu cầu Ajax trong PHP nhưng tôi muốn một cái gì đó cụ thể cho Laravel.

Cảm ơn

Đã cập nhật:

Tôi đã thử sử dụng

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

Nhưng tôi nhận được lỗi: Non-static method Illuminate\Http\Request::ajax() should not be called statically, assuming $this from incompatible context

Lớp cho thấy rằng đây không phải là một phương thức tĩnh.

Câu trả lời:


190

Có lẽ điều này sẽ hữu ích. Bạn phải tham khảo @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";
        }

Bạn đúng rồi. Điều này sẽ hoạt động trong trường hợp của tôi vì tôi đang sử dụng không gian tên Illuminate\Http\Request;trong bộ điều khiển của mình. Cảm ơn
Raheel

1
Bạn cũng có thể sử dụng "theo yêu cầu () -> ajax ()" nếu cần thiết
badcom

Tôi có thể xác nhận điều này hoạt động trong 5.2. Tôi đã sử dụng trình trợ giúp request()->ajax()Cảm ơn!
cbloss793

22

Để kiểm tra một yêu cầu ajax, bạn có thể sử dụng if (Request::ajax())

Lưu ý: Nếu bạn đang sử dụng laravel 5, thì trong bộ điều khiển thay thế

use Illuminate\Http\Request;

với

use Request; 

Tôi hy vọng nó sẽ hoạt động.


20

Bạn đang sử dụng sai Requestlớp. Nếu bạn muốn sử dụng Mặt tiền như: Request::ajax()bạn phải nhập lớp này:

use Illuminate\Support\Facades\Request;

Và không Illumiante\Http\Request


Một giải pháp khác sẽ là đưa vào một phiên bản của lớp yêu cầu thực:

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

(Bây giờ ở đây bạn phải nhập Illuminate\Http\Request)


bạn đúng rồi. Tôi đã sửa điều đó. Một số người khác đặt một câu lệnh sử dụng ở trên và tôi không nhìn vào điều đó. Cảm ơn :)
Raheel

15

$ request-> wantJson ()

Bạn có thể thử $request->wantsJson()nếu $request->ajax()không hiệu quả

$request->ajax() hoạt động nếu thư viện JavaScript của bạn đặt tiêu đề X-Request-With HTTP.

Theo mặc định, Laravel đặt tiêu đề này trong js / bootstrap.js

window.axios = require('axios');

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

Trong trường hợp của tôi, tôi đã sử dụng mã giao diện người dùng khác và tôi phải đặt tiêu đề này theo cách thủ công $request->ajax()để hoạt động.

Nhưng $request->wantsJson()sẽ kiểm tra truy vấn axios mà không cần tiêu đề 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

9
if(Request::ajax()) 

Có vẻ là câu trả lời đúng. http://laravel.com/api/5.0/Illuminate/Http/Request.html#method_ajax


1
Tôi không chắc đây có phải ý bạn không, nhưng Laravel sử dụng mẫu thiết kế Mặt tiền để các cuộc gọi của bạn có thể được thực hiện giống như các phương thức tĩnh: laravel.com/docs/4.2/facades#facade-class-reference Liên kết đó hiển thị danh sách các công dụng của Facades Laravel. Bạn có đang sử dụng nó trong Bộ điều khiển không?
Matthew Way

tôi đã sử dụng sai câu lệnh. xin lỗi Nhưng cảm ơn vì đã có cái nhìn tổng quan về Mặt tiền :) Đây là thông tin.
Raheel

6

Đối với những người làm việc với AngularJS front-end, nó không sử dụng tiêu đề Ajax mà laravel đang mong đợi. ( Đọc thêm )

Sử dụng Request :: wantJson () cho AngularJS:

if(Request::wantsJson()) { 
    // Client wants JSON returned 
}

đây sẽ là câu trả lời tại
Salal Aslam

6

Những người thích sử dụng trình trợ giúp laravel, họ có thể kiểm tra xem một yêu cầu có phải là ajax hay không bằng cách sử dụng trình request()trợ giúp laravel .

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

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

2

Đôi khi Request::ajax()không hoạt động, sau đó sử dụng\Request::ajax()


Nó sẽ không hoạt động nếu không gian tên không được sử dụng. Dù sao, cảm ơn
Raheel

0

sau khi viết mã jquery, hãy thực hiện xác thực này trong tuyến đường của bạn hoặc trong bộ điều khiển.

$.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';}
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.