Laravel - prüfen Sie, ob Ajax dies verlangt

95

Ich habe versucht, einen Weg zu finden, um den Ajax-Anruf in Laravel zu bestimmen, aber ich finde kein Dokument dazu.

Ich habe eine index()Funktion, mit der ich die Situation je nach Art der Anfrage unterschiedlich behandeln möchte. Grundsätzlich ist dies eine Ressourcencontrollermethode, die an eine GET-Anforderung gebunden ist.

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

Ich kenne die anderen Methoden zum Bestimmen der Ajax-Anfrage in PHP, aber ich möchte etwas Spezielles für Laravel.

Vielen Dank

Aktualisiert:

Ich habe es versucht

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

Aber ich erhalte Fehler: Non-static method Illuminate\Http\Request::ajax() should not be called statically, assuming $this from incompatible context

Die Klasse zeigt, dass dies keine statische Methode ist.

Raheel
quelle

Antworten:

190

Vielleicht hilft das. Sie müssen das @param verweisen

         /**       
         * 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
quelle
Du hast recht. Dies funktioniert in meinem Fall, da ich den Namespace von Illuminate\Http\Request;in meinen Controllern verwende. Danke
Raheel
1
Sie können bei Bedarf auch "request () -> ajax ()" verwenden
badcom
Ich kann bestätigen, dass dies in 5.2 funktioniert. Ich habe den Helfer benutzt request()->ajax()Danke!
cbloss793
22

Um eine Ajax-Anfrage zu überprüfen, können Sie verwenden if (Request::ajax())

Hinweis: Wenn Sie Laravel 5 verwenden, ersetzen Sie es im Controller

use Illuminate\Http\Request;

mit

use Request; 

Ich hoffe es wird funktionieren.

Jnanaranjan
quelle
20

Sie verwenden die falsche RequestKlasse. Wenn Sie die Fassade wie folgt verwenden möchten: Request::ajax()Sie müssen diese Klasse importieren:

use Illuminate\Support\Facades\Request;

Und nicht Illumiante\Http\Request


Eine andere Lösung wäre das Einfügen einer Instanz der realen Anforderungsklasse:

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

(Jetzt müssen Sie hier importieren Illuminate\Http\Request)

lukasgeiter
quelle
Du hast recht. Ich habe das behoben. Ein anderer Typ hat oben eine Gebrauchserklärung abgegeben, und das habe ich mir nicht angesehen. Danke :)
Raheel
15

$ request-> wantJson ()

Sie können versuchen, $request->wantsJson()wenn $request->ajax()nicht funktioniert

$request->ajax() funktioniert, wenn Ihre JavaScript-Bibliothek einen X-Requested-With-HTTP-Header festlegt.

Standardmäßig setzt Laravel diesen Header in js / bootstrap.js

window.axios = require('axios');

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

In meinem Fall habe ich einen anderen Frontend-Code verwendet und musste diesen Header manuell einfügen $request->ajax(), damit er funktioniert.

Aber $request->wantsJson()überprüfen die axios Abfrage , ohne die Notwendigkeit für einen Header 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
Илья Зеленько
quelle
9
if(Request::ajax()) 

Scheint die richtige Antwort zu sein. http://laravel.com/api/5.0/Illuminate/Http/Request.html#method_ajax

Matthew Way
quelle
1
Ich bin mir nicht sicher, ob Sie das meinen, aber Laravel verwendet das Fassaden-Entwurfsmuster, damit Ihre Anrufe wie statische Methoden erfolgen können: laravel.com/docs/4.2/facades#facade-class-reference Dieser Link zeigt a Liste der Fassaden, die Laravel verwendet. Verwenden Sie es in einem Controller?
Matthew Way
Ich habe eine falsche Use-Anweisung verwendet. Entschuldigung, aber danke für einen Überblick über die Fassaden :) Dies ist informativ.
Raheel
6

Für diejenigen, die mit AngularJS- Frontend arbeiten, wird nicht der Ajax-Header verwendet, den laravel erwartet. ( Lesen Sie mehr )

Verwenden Sie Request :: wantJson () für AngularJS:

if(Request::wantsJson()) { 
    // Client wants JSON returned 
}
Justin
quelle
Dies sollte jetzt die Antwort sein
Salal Aslam
6

Diejenigen, die Laravel-Helfer bevorzugen, können mit Laravel-Helfern überprüfen, ob eine Anfrage Ajax ist request().

if(request()->ajax())
   // code
Lee Shin
quelle
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'));
}

quelle
2

Manchmal Request::ajax()funktioniert es nicht, dann verwenden\Request::ajax()

Nagibaba
quelle
Es funktioniert nicht, wenn der Namespace nicht verwendet wird. Trotzdem danke
Raheel
0

Führen Sie diese Validierung nach dem Schreiben des Abfragecodes in Ihrer Route oder im Controller durch.

$.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
quelle