Laravel - проверьте, есть ли запрос Ajax

98

Я пытался найти способ определить вызов 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

Класс показывает, что это не статический метод.

Рахил
источник

Ответы:

193

Может это поможет. Вы должны сослаться на @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
источник
Ты прав. Это будет работать в моем случае, поскольку я использую пространство имен Illuminate\Http\Request;в своих контроллерах. Спасибо
Raheel
1
Вы также можете использовать «request () -> ajax ()», если необходимо
badcom
Я могу подтвердить, что это работает в 5.2. Воспользовался помощником request()->ajax()Спасибо!
cbloss793
22

Чтобы проверить запрос ajax, вы можете использовать if (Request::ajax())

Примечание: если вы используете laravel 5, то в контроллере замените

use Illuminate\Http\Request;

с участием

use Request; 

Надеюсь, это сработает.

Джнанаранджан
источник
21

Вы используете неправильный Requestкласс. Если вы хотите использовать Фасад как: 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

$ запрос-> хочетJson ()

Можете попробовать, $request->wantsJson()если $request->ajax()не работает

$request->ajax() работает, если ваша библиотека JavaScript устанавливает HTTP-заголовок X-Requested-With.

По умолчанию 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. Вы используете его в контроллере?
Мэтью Уэй,
Я использовал неправильную инструкцию использования. Извините, но спасибо за обзор фасадов :) Это информативно.
Raheel
6

Для тех, кто работает с интерфейсом AngularJS , он не использует ожидаемый laravel заголовок Ajax. ( Читать дальше )

Используйте Request :: wantJson () для AngularJS:

if(Request::wantsJson()) { 
    // Client wants JSON returned 
}
Джастин
источник
это должен быть ответ сейчас
Салал Аслам
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';}
});
Мухаммад Авайс
источник