Laravel - перевірте, чи запитує Ajax


96

Я намагався знайти спосіб визначити дзвінок 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

Клас показує, що це не статичний метод.

Відповіді:


191

Можливо, це допомагає. Ви повинні звернутися до @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;у своїх контролерах. Дякую
Рахіл

1
Ви також можете скористатися "request () -> ajax ()", якщо потрібно
badcom

Я можу підтвердити, що це працює в 5.2. Я скористався помічником request()->ajax()Дякую!
cbloss793,

22

Для перевірки запиту ajax ви можете використовувати if (Request::ajax())

Примітка: Якщо ви використовуєте laravel 5, то в контролері замініть

use Illuminate\Http\Request;

з

use Request; 

Сподіваюся, це спрацює.


20

Ви використовуєте неправильний Requestклас. Якщо ви хочете використовувати Фасад, наприклад: Request::ajax()вам доведеться імпортувати цей клас:

use Illuminate\Support\Facades\Request;

І ні Illumiante\Http\Request


Іншим рішенням було б введення екземпляра реального класу запитів:

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

(Тепер тут вам доведеться імпортувати Illuminate\Http\Request)


ти правий. Я це виправив. Якийсь інший хлопець поставив заяву про використання вище, і я не дивився на це. Спасибі :)
Рахіл,

16

$ request-> wantsJson ()

Можна спробувати, $request->wantsJson()якщо $request->ajax()не виходить

$request->ajax() працює, якщо ваша бібліотека JavaScript встановлює заголовок HT-X-Reserved-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

9
if(Request::ajax()) 

Виглядає як правильна відповідь. http://laravel.com/api/5.0/Illuminate/Http/Request.html#method_ajax


1
Я не впевнений, що це саме те, що ви маєте на увазі, але Laravel використовує шаблон дизайну фасадів, щоб ваші дзвінки могли здійснюватися як статичні методи: laravel.com/docs/4.2/facades#facade-class-reference Це посилання показує список фасадів, які використовує Laravel. Ви використовуєте його в контролері?
Меттью Шлях

я використовував заяву про неправильне використання. вибачте Але дякую за огляд фасадів :) Це інформативно.
Рахіл


6

Ті, хто вважає за краще використовувати помічники laravel, вони можуть перевірити, чи є запит ajax, використовуючи request()помічник 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

Іноді Request::ajax()не працює, тоді використовуйте\Request::ajax()


Це не буде працювати, якщо не використовується простір імен. У будь-якому разі спасибі
Raheel

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';}
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.