Laravel-检查Ajax是否请求


95

我一直在试图找到一种方法来确定Laravel中的ajax调用,但是我没有找到任何有关它的文档。

我有一个index()功能,我想根据请求的性质以不同的方式处理情况。基本上,这是绑定到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'));
    }

我知道在PHP中确定Ajax请求的其他方法,但是我想要一些Laravel特有的方法。

谢谢

更新:

我尝试使用

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

但是我收到错误: Non-static method Illuminate\Http\Request::ajax() should not be called statically, assuming $this from incompatible context

该类表明这不是静态方法。

Answers:


190

也许这会有所帮助。您必须引用@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";
        }

你是对的。就我而言,这将起作用,因为我Illuminate\Http\Request;在控制器中使用的名称空间。谢谢
Raheel

1
您也可以根据需要使用“ request()-> ajax()”
badcom

我可以在5.2中确认这项工作。我用了助手,request()->ajax()谢谢!
cbloss793

22

要检查ajax请求,您可以使用 if (Request::ajax())

注意:如果您使用的是laravel 5,则在控制器中更换

use Illuminate\Http\Request;

use Request; 

我希望它能起作用。


20

您使用了错误的Request类。如果要像这样使用Facade Request::ajax(),则必须导入此类:

use Illuminate\Support\Facades\Request;

并不是 Illumiante\Http\Request


另一个解决方案是注入真实请求类的实例:

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

(现在,您必须导入Illuminate\Http\Request


你是对的。我修好了 其他人在上面放了一条使用声明,而我没有看过。谢谢:)
Raheel

15

$ request-> wantsJson()

您可以尝试,$request->wantsJson()如果$request->ajax()不起作用

$request->ajax() 如果您的JavaScript库设置了X-Requested-With HTTP标头,则可以使用。

默认情况下,Laravel在js / bootstrap.js中设置此标头

window.axios = require('axios');

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

就我而言,我使用了不同的前端代码,并且必须手动放置此标头$request->ajax()才能工作。

但是$request->wantsJson()将检查axios查询而无需标题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()) 

看起来是正确的答案。 http://laravel.com/api/5.0/Illuminate/Http/Request.html#method_ajax


1
我不确定这是否是您的意思,但是Laravel利用Facade设计模式来使您的调用可以像静态方法一样进行:laravel.com/docs/4.2/facades#facade-class-reference该链接显示了外墙Laravel使用的列表。您是否在控制器中使用它?
马修·威

我使用了错误的使用声明。抱歉,但是感谢您对Facades的概述:)这是提供信息的。
Raheel 2015年


6

那些喜欢使用laravel帮助器的人可以使用laravel帮助器检查请求是否为Ajax request()

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

有时Request::ajax()不起作用,然后使用\Request::ajax()


如果不使用名称空间,它将不起作用。无论如何,谢谢
Raheel

0

编写完jQuery代码后,请在您的路由或控制器中执行此验证。

$.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';}
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.