Laravel - 检查Ajax是否请求$request->wantsJson()

2022-08-30 07:13:20

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

我有一个控制器函数,我想根据请求的性质以不同的方式处理响应。基本上,这是绑定到 GET 请求的资源控制器方法。index()

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

答案 2

$request->wantsJson()

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

$request->ajax()如果您的 JavaScript 库设置了一个 X-Request-With HTTP 标头,则有效。

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

window.axios = require('axios');

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

在我的情况下,我使用了不同的前端代码,我必须手动放置此标头才能工作。$request->ajax()

但是将检查公理查询,而无需标头:$request->wantsJson()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

推荐