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.

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

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.


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)


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

9
if(Request::ajax()) 

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


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 
}

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

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 veces Request::ajax()no funciona, luego usa\Request::ajax()


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';}
});
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.