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.

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";
        }

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.


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)


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

9
if(Request::ajax()) 

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


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 
}

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

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

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


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';}
});
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.