Laravel - comprobar si la solicitud Ajax

95

He estado tratando de encontrar una manera de determinar la llamada ajax en Laravel pero no encuentro ningún documento al respecto.

Tengo una index()función que quiero manejar la situación de manera diferente según la naturaleza de la solicitud. Básicamente, este es un método de controlador de recursos que está vinculado a la solicitud 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'));
    }

Conozco los otros métodos para determinar la solicitud Ajax en PHP pero quiero algo específico para Laravel.

Gracias

Actualizado:

Intenté usar

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

Pero estoy recibiendo un error: Non-static method Illuminate\Http\Request::ajax() should not be called statically, assuming $this from incompatible context

La clase muestra que este no es un método estático.

Raheel
fuente

Respuestas:

190

Quizás esto ayude. Tienes que referir 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";
        }
Crack_David
fuente
Tienes razón. Esto funcionará en mi caso, ya que estoy usando el espacio de nombres de Illuminate\Http\Request;en mis controladores. Gracias
Raheel
1
También puede usar "request () -> ajax ()" si es necesario
badcom
Puedo confirmar que esto funciona en 5.2. Usé el ayudante request()->ajax()¡Gracias!
cbloss793
22

Para verificar una solicitud ajax, puede usar if (Request::ajax())

Nota: Si está utilizando laravel 5, reemplace en el controlador

use Illuminate\Http\Request;

con

use Request; 

Espero que funcione.

Jnanaranjan
fuente
20

Estás usando la Requestclase incorrecta . Si desea utilizar la fachada como: Request::ajax()debe importar esta clase:

use Illuminate\Support\Facades\Request;

Y no Illumiante\Http\Request


Otra solución sería inyectar una instancia de la clase de solicitud real:

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

(Ahora aquí tienes que importar Illuminate\Http\Request)

lukasgeiter
fuente
tienes razón. Lo arreglé. Otro tipo puso una declaración de uso arriba y yo no miré eso. Gracias :)
Raheel
15

$ solicitud-> wantsJson ()

Puedes probar $request->wantsJson()si $request->ajax()no funciona

$request->ajax() funciona si su biblioteca de JavaScript establece un encabezado HTTP X-Requested-With.

Por defecto, Laravel establece este encabezado en js / bootstrap.js

window.axios = require('axios');

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

En mi caso, utilicé un código de interfaz diferente y tuve que poner este encabezado manualmente para $request->ajax() que funcionara.

Pero $request->wantsJson()verificará la consulta axios sin la necesidad de un encabezado 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
Илья Зеленько
fuente
9
if(Request::ajax()) 

Parece ser la respuesta correcta. http://laravel.com/api/5.0/Illuminate/Http/Request.html#method_ajax

Matthew Way
fuente
1
No estoy seguro de si esto es lo que quieres decir, pero Laravel hace uso del patrón de diseño Facade para que tus llamadas se puedan realizar como métodos estáticos: laravel.com/docs/4.2/facades#facade-class-reference Ese enlace muestra un lista de fachadas que utiliza Laravel. ¿Lo estás usando en un controlador?
Matthew Way
Estaba usando una declaración de uso incorrecto. Lo siento Pero gracias por una descripción general de las fachadas :) Esto es informativo.
Raheel
6

Para aquellos que trabajan con el front-end de AngularJS , no usa el encabezado Ajax que laravel espera. ( Leer más )

Utilice Request :: wantsJson () para AngularJS:

if(Request::wantsJson()) { 
    // Client wants JSON returned 
}
Justin
fuente
esta debería ser la respuesta ahora
Salal Aslam
6

Aquellos que prefieren usar los ayudantes de laravel pueden verificar si una solicitud es ajax usando el request()ayudante de laravel .

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

fuente
2

A veces Request::ajax()no funciona, luego usa\Request::ajax()

Nagibaba
fuente
No funcionará si no se utiliza el espacio de nombres. De todos modos gracias
Raheel
0

después de escribir el código jquery, realice esta validación en su ruta o en el controlador.

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