Laravel - 检查 Ajax 是不是请求

Posted

技术标签:

【中文标题】Laravel - 检查 Ajax 是不是请求【英文标题】:Laravel - check if Ajax requestLaravel - 检查 Ajax 是否请求 【发布时间】:2015-05-27 16:51:42 【问题描述】:

我一直试图找到一种方法来确定 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(
        '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

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

【问题讨论】:

【参考方案1】:

也许这会有所帮助。你必须参考@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; 的命名空间。谢谢 如果需要也可以使用“request()->ajax()” 我可以确认这在 5.2 中有效。我用了助手request()->ajax()谢谢!【参考方案2】:

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

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

use Illuminate\Http\Request;

use Request; 

我希望它会起作用。

【讨论】:

【参考方案3】:

您使用了错误的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

【讨论】:

你是对的。我修好了。其他人在上面放了一个使用声明,我没有看。谢谢:)【参考方案4】:

$request->wantsJson()

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

$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

【讨论】:

如果您的控制器正在决定是否使用 JSON 或其他内容进行响应,请使用 $request->wantsJson()。这是比使用$request->isAjax() 更好的方法,因为wantsJson() 遵循Content Negotiation 的HTTP 规范。【参考方案5】:
if(Request::ajax()) 

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

【讨论】:

我不确定这是否是您的意思,但 Laravel 使用了 Facade 设计模式,因此您的调用可以像静态方法一样进行:laravel.com/docs/4.2/facades#facade-class-reference 该链接显示了 Facades Laravel 的列表用途。你在控制器中使用它吗? 我使用了错误的使用语句。抱歉,但感谢您对 Facades 的概述 :) 这提供了丰富的信息。【参考方案6】:

对于那些使用 AngularJS 前端的人,它不使用 laravel 所期望的 Ajax 标头。 (Read more)

对 AngularJS 使用 Request::wantsJson():

if(Request::wantsJson())  
    // Client wants JSON returned 

【讨论】:

这应该是现在的答案【参考方案7】:

那些喜欢使用 laravel 助手的人可以使用 laravel request() helper 检查请求是否为 ajax。

if(request()->ajax())
   // code

【讨论】:

【参考方案8】:
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'));

【讨论】:

【参考方案9】:

有时候Request::ajax()不起作用,那就用\Request::ajax()

【讨论】:

如果不使用命名空间,它将不起作用。总之谢谢【参考方案10】:
Do something like this
public function functionName(User $user): string

    (string) $message = "";
    // check if request is ajax
    if(request()->ajax())
    
        if($this->isOwner($user->id))
            $message = 'success';
        else
            $message = "You are unauthorized to perform this action.";
        
    else
        $message = 'Wrong server request';
    
    return $message;        

【讨论】:

【参考方案11】:

编写 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';
);

【讨论】:

【参考方案12】:

大多数答案都可以正常工作。我们也可以查看请求头

request()->header('Accept')=='application/json'

检查请求类型

【讨论】:

以上是关于Laravel - 检查 Ajax 是不是请求的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.7 Ajax 发布请求返回 419 状态码

Laravel AJAX 请求进入路由 api Vue 错误

在 Laravel 中检查请求数组是不是为空

如何检查请求是不是通过 CodeIgniter 中的 AJAX 发出?

Laravel ajax请求419错误及解决办法(CSRF验证) 阿星小栈

Laravel 5.8 文件上传使用 PUT 方法和 ajax