Laravel: controlla se Ajax richiede


96

Ho cercato di trovare un modo per determinare la chiamata ajax in Laravel ma non trovo alcun documento al riguardo.

Ho una index()funzione che voglio gestire la situazione in modo diverso in base alla natura della richiesta. Fondamentalmente si tratta di un metodo di controller di risorse associato alla richiesta 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'));
    }

Conosco gli altri metodi per determinare la richiesta Ajax in PHP ma voglio qualcosa di specifico per Laravel.

Grazie

Aggiornato:

Ho provato a usare

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

Ma ricevo un errore: Non-static method Illuminate\Http\Request::ajax() should not be called statically, assuming $this from incompatible context

La classe mostra che questo non è un metodo statico.

Risposte:


191

Forse questo aiuta. Devi fare riferimento al @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";
        }

Hai ragione. Questo funzionerà nel mio caso poiché sto usando lo spazio dei nomi Illuminate\Http\Request;nei miei controller. Grazie
Raheel

1
Puoi anche usare "request () -> ajax ()" se necessario
badcom

Posso confermare che funziona in 5.2. Ho usato l'helper request()->ajax()Grazie!
cbloss793

22

Per controllare una richiesta ajax puoi usare if (Request::ajax())

Nota: se stai usando laravel 5, sostituisci il controller

use Illuminate\Http\Request;

con

use Request; 

Spero che funzioni.


20

Stai usando la Requestclasse sbagliata . Se vuoi usare Facade come: Request::ajax()devi importare questa classe:

use Illuminate\Support\Facades\Request;

E non Illumiante\Http\Request


Un'altra soluzione sarebbe iniettare un'istanza della classe di richiesta reale:

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

(Ora qui devi importare Illuminate\Http\Request)


hai ragione. L'ho risolto. Qualcun altro ha messo una dichiarazione d'uso sopra e io non l'ho guardata. Grazie :)
Raheel

16

$ request-> wantsJson ()

Puoi provare $request->wantsJson()se $request->ajax()non funziona

$request->ajax() funziona se la tua libreria JavaScript imposta un'intestazione HTTP X-Requested-With.

Per impostazione predefinita Laravel imposta questa intestazione in js / bootstrap.js

window.axios = require('axios');

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

Nel mio caso, ho utilizzato un codice frontend diverso e ho dovuto inserire manualmente questa intestazione per $request->ajax()funzionare.

Ma $request->wantsJson()controllerà la query axios senza la necessità di un'intestazione 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()) 

Sembra essere la risposta giusta. http://laravel.com/api/5.0/Illuminate/Http/Request.html#method_ajax


1
Non sono sicuro che questo sia ciò che intendi, ma Laravel utilizza il modello di progettazione Facade in modo che le tue chiamate possano essere effettuate come metodi statici: laravel.com/docs/4.2/facades#facade-class-reference Quel link mostra un elenco delle facciate utilizzate da Laravel. Lo stai usando in un controller?
Matthew Way

stavo usando una dichiarazione di utilizzo errata. scusate Ma grazie per una panoramica delle facciate :) Questo è informativo.
Raheel


6

Coloro che preferiscono usare gli helper di laravel possono controllare se una richiesta è ajax usando l' request()helper di 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

A volte Request::ajax()non funziona, quindi usa\Request::ajax()


Non funzionerà se lo spazio dei nomi non viene utilizzato. Comunque grazie
Raheel

0

dopo aver scritto il codice jquery, eseguire questa convalida nel percorso o nel 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';}
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.