Laravel - vérifier si la demande Ajax

96

J'ai essayé de trouver un moyen de déterminer l'appel ajax dans Laravel mais je ne trouve aucun document à ce sujet.

J'ai une index()fonction que je souhaite gérer différemment selon la nature de la demande. Fondamentalement, il s'agit d'une méthode de contrôleur de ressources liée à la requête 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'));
    }

Je connais les autres méthodes de détermination de la requête Ajax en PHP mais je veux quelque chose de spécifique à Laravel.

Merci

Actualisé:

J'ai essayé d'utiliser

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

Mais je reçois une erreur: Non-static method Illuminate\Http\Request::ajax() should not be called statically, assuming $this from incompatible context

La classe montre qu'il ne s'agit pas d'une méthode statique.

Raheel
la source

Réponses:

191

Peut-être que cela aide. Vous devez vous référer au @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
la source
Vous avez raison. Cela fonctionnera dans mon cas car j'utilise l'espace de noms de Illuminate\Http\Request;dans mes contrôleurs. Merci
Raheel
1
Vous pouvez également utiliser "request () -> ajax ()" si nécessaire
badcom
Je peux confirmer que cela fonctionne dans la version 5.2. J'ai utilisé l'aide request()->ajax()Merci!
cbloss793
22

Pour vérifier une requête ajax, vous pouvez utiliser if (Request::ajax())

Remarque: si vous utilisez laravel 5, dans le contrôleur, remplacez

use Illuminate\Http\Request;

avec

use Request; 

J'espère que ça va marcher.

Jnanaranjan
la source
20

Vous utilisez la mauvaise Requestclasse. Si vous souhaitez utiliser la façade comme: Request::ajax()vous devez importer cette classe:

use Illuminate\Support\Facades\Request;

Et pas Illumiante\Http\Request


Une autre solution consisterait à injecter une instance de la classe de requête réelle:

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

(Maintenant, ici, vous devez importer Illuminate\Http\Request)

Lukasgeiter
la source
vous avez raison. J'ai corrigé ça. Un autre gars a mis une déclaration d'utilisation ci-dessus et je ne l'ai pas regardé. Merci :)
Raheel
16

$ request-> wantJson ()

Vous pouvez essayer $request->wantsJson()si $request->ajax()cela ne fonctionne pas

$request->ajax() fonctionne si votre bibliothèque JavaScript définit un en-tête HTTP X-Requested-With.

Par défaut, Laravel définit cet en-tête dans js / bootstrap.js

window.axios = require('axios');

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

Dans mon cas, j'ai utilisé un code frontal différent et j'ai dû mettre cet en-tête manuellement pour $request->ajax()qu'il fonctionne.

Mais $request->wantsJson()vérifiera la requête axios sans avoir besoin d'un en-tête 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
Илья Зеленько
la source
9
if(Request::ajax()) 

Cela semble être la bonne réponse. http://laravel.com/api/5.0/Illuminate/Http/Request.html#method_ajax

Matthew Way
la source
1
Je ne sais pas si c'est ce que vous voulez dire, mais Laravel utilise le modèle de conception Façade pour que vos appels puissent être effectués comme des méthodes statiques: laravel.com/docs/4.2/facades#facade-class-reference Ce lien montre un liste des façades utilisées par Laravel. L'utilisez-vous dans un contrôleur?
Matthew Way
J'utilisais une mauvaise déclaration d'utilisation. désolé Mais merci pour un aperçu de Façades :) Ceci est informatif.
Raheel
6

Pour ceux qui travaillent avec AngularJS front-end, il n'utilise pas l'en-tête Ajax que laravel attend. ( Lire la suite )

Utilisez Request :: wantJson () pour AngularJS:

if(Request::wantsJson()) { 
    // Client wants JSON returned 
}
Justin
la source
cela devrait être la réponse maintenant
Salal Aslam
6

Ceux qui préfèrent utiliser les helpers laravel peuvent vérifier si une requête est ajax en utilisant laravel request()helper.

if(request()->ajax())
   // code
lee shin
la source
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'));
}

la source
2

Parfois Request::ajax()ne fonctionne pas, puis utilisez\Request::ajax()

Nagibaba
la source
Cela ne fonctionnera pas si l'espace de noms n'est pas utilisé. En tout cas merci
Raheel
0

après avoir écrit le code jquery effectuez cette validation dans votre route ou dans controller.

$.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
la source