Laravel - verifique se o pedido Ajax

96

Tenho tentado encontrar uma maneira de determinar a chamada de Ajax no Laravel, mas não encontrei nenhum documento a respeito.

Tenho uma index()função com a qual desejo lidar com a situação de maneira diferente com base na natureza da solicitação. Basicamente, este é um método de controlador de recurso vinculado à solicitação 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'));
    }

Eu conheço os outros métodos de determinar a solicitação Ajax em PHP, mas quero algo específico para o Laravel.

obrigado

Atualizada:

Tentei usar

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

Mas estou recebendo um erro: Non-static method Illuminate\Http\Request::ajax() should not be called statically, assuming $this from incompatible context

A aula mostra que este não é um método estático.

Raheel
fonte

Respostas:

191

Talvez isso ajude. Você tem que referir o @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
fonte
Você está certo. Isso funcionará no meu caso, pois estou usando o namespace de Illuminate\Http\Request;em meus controladores. Obrigado
Raheel
1
Você também pode usar "request () -> ajax ()" se necessário
badcom
Posso confirmar que isso funciona em 5.2. Usei o ajudante request()->ajax()Obrigado!
cbloss793
22

Para verificar uma solicitação ajax, você pode usar if (Request::ajax())

Nota: Se você estiver usando laravel 5, então no controlador substitua

use Illuminate\Http\Request;

com

use Request; 

Espero que funcione.

Jnanaranjan
fonte
20

Você está usando a Requestclasse errada . Se você deseja usar a fachada como: Request::ajax()você deve importar esta classe:

use Illuminate\Support\Facades\Request;

E não Illumiante\Http\Request


Outra solução seria injetar uma instância da classe de solicitação real:

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

(Agora aqui você tem que importar Illuminate\Http\Request)

lukasgeiter
fonte
você está certo. Eu consertei isso. Outro cara colocou uma declaração de uso acima e eu não olhei para isso. Obrigado :)
Raheel
16

$ request-> wantJson ()

Você pode tentar $request->wantsJson()se $request->ajax()não funcionar

$request->ajax() funciona se sua biblioteca JavaScript definir um cabeçalho HTTP X-Requested-With.

Por padrão, o Laravel define este cabeçalho em js / bootstrap.js

window.axios = require('axios');

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

No meu caso, usei um código de front-end diferente e tive que colocar esse cabeçalho manualmente para $request->ajax()funcionar.

Mas $request->wantsJson()irá verificar a consulta axios sem a necessidade de um cabeçalho 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
Илья Зеленько
fonte
9
if(Request::ajax()) 

Parece ser a resposta certa. http://laravel.com/api/5.0/Illuminate/Http/Request.html#method_ajax

Matthew Way
fonte
1
Não tenho certeza se é isso que você quer dizer, mas o Laravel faz uso do padrão de projeto Facade para que suas chamadas possam ser feitas como métodos estáticos: laravel.com/docs/4.2/facades#facade-class-reference Esse link mostra um lista de fachadas que o Laravel usa. Você está usando em um controlador?
Matthew Way
eu estava usando a declaração de uso incorreto. desculpe, mas obrigado por uma visão geral de fachadas :) Isso é informativo.
Raheel
6

Para aqueles que trabalham com o front-end AngularJS , ele não usa o laravel de cabeçalho Ajax esperado. ( Leia mais )

Use Request :: wantJson () para AngularJS:

if(Request::wantsJson()) { 
    // Client wants JSON returned 
}
Justin
fonte
esta deve ser a resposta agora
Salal Aslam
6

Aqueles que preferem usar auxiliares de laravel, podem verificar se uma solicitação é ajax usando request()auxiliar de laravel .

if(request()->ajax())
   // code
Lee Shin
fonte
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'));
}

fonte
2

Às vezes Request::ajax()não funciona, então use\Request::ajax()

Nagibaba
fonte
Não funcionará se o namespace não for usado. De qualquer forma, obrigado
Raheel
0

depois de escrever o código jquery execute esta validação em sua rota ou no 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
fonte