Laravel - sprawdź, czy żądanie Ajax

102

Próbowałem znaleźć sposób na określenie wywołania Ajax w Laravel, ale nie znalazłem żadnego dokumentu na ten temat.

Mam index()funkcję, z którą chcę radzić sobie w różnych sytuacjach w zależności od charakteru żądania. Zasadniczo jest to metoda kontrolera zasobów, która jest powiązana z żądaniem 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'));
    }

Znam inne metody określania żądania Ajax w PHP, ale chcę czegoś konkretnego dla Laravel.

Dzięki

Zaktualizowano:

Próbowałem użyć

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

Ale otrzymuję błąd: Non-static method Illuminate\Http\Request::ajax() should not be called statically, assuming $this from incompatible context

Klasa pokazuje, że nie jest to metoda statyczna.

Raheel
źródło

Odpowiedzi:

201

Może to pomoże. Musisz polecić @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
źródło
Masz rację. To zadziała w moim przypadku, ponieważ używam przestrzeni nazw Illuminate\Http\Request;w moich kontrolerach. Dzięki
Raheel
1
W razie potrzeby możesz również użyć "request () -> ajax ()"
badcom
Mogę potwierdzić, że to działa w 5.2. Użyłem pomocnika request()->ajax()Dzięki!
cbloss793
23

Aby sprawdzić żądanie AJAX, możesz użyć if (Request::ajax())

Uwaga: jeśli używasz laravel 5, to w kontrolerze wymień

use Illuminate\Http\Request;

z

use Request; 

Mam nadzieję, że to zadziała.

Jnanaranjan
źródło
22

Używasz złej Requestklasy. Jeśli chcesz używać Fasady w następujący sposób: Request::ajax()musisz zaimportować tę klasę:

use Illuminate\Support\Facades\Request;

I nie Illumiante\Http\Request


Innym rozwiązaniem byłoby wstrzyknięcie instancji prawdziwej klasy żądania:

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

(Teraz musisz zaimportować Illuminate\Http\Request)

lukasgeiter
źródło
masz rację. Naprawiłem to. Ktoś inny umieścił powyżej oświadczenie użycia, a ja na to nie patrzyłem. Dzięki :)
Raheel
16

$ request-> wantJson ()

Możesz spróbować, $request->wantsJson()jeśli $request->ajax()nie działa

$request->ajax() działa, jeśli Twoja biblioteka JavaScript ustawia nagłówek X-Requested-With HTTP.

Domyślnie Laravel ustawia ten nagłówek w js / bootstrap.js

window.axios = require('axios');

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

W moim przypadku użyłem innego kodu frontendu i musiałem ręcznie wstawić ten nagłówek, $request->ajax()aby działał.

Ale $request->wantsJson()sprawdzi zapytanie axios bez potrzeby nagłówka 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
Илья Зеленько
źródło
10
if(Request::ajax()) 

Wygląda na właściwą odpowiedź. http://laravel.com/api/5.0/Illuminate/Http/Request.html#method_ajax

Matthew Way
źródło
1
Nie jestem pewien, czy to masz na myśli, ale Laravel wykorzystuje wzorzec projektowy Fasady, aby Twoje wywołania mogły być wykonywane jak metody statyczne: laravel.com/docs/4.2/facades#facade-class-reference Ten link pokazuje lista fasad używanych przez Laravel. Czy używasz go w kontrolerze?
Matthew Way
użyłem niewłaściwego użycia. przepraszam Ale dzięki za przegląd elewacji :) To ma charakter informacyjny.
Raheel
6

Dla tych, którzy pracują z front-endem AngularJS , nie używa nagłówka Ajax, którego oczekuje laravel. ( Czytaj więcej )

Użyj Request :: WantJson () dla AngularJS:

if(Request::wantsJson()) { 
    // Client wants JSON returned 
}
Justin
źródło
to powinna być odpowiedź teraz
Salal Aslam
6

Ci, którzy wolą używać pomocników laravel, mogą sprawdzić, czy żądanie nie pochodzi z ajax, używając request()helpera laravel .

if(request()->ajax())
   // code
lee shin
źródło
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'));
}

źródło
3

Czasami Request::ajax()nie działa, a następnie użyj\Request::ajax()

Nagibaba
źródło
Nie będzie działać, jeśli przestrzeń nazw nie jest używana. W każdym razie dzięki
Raheel
0

po zapisaniu kodu jQuery przeprowadź tę walidację na swojej trasie lub w kontrolerze.

$.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
źródło