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 错误
如何检查请求是不是通过 CodeIgniter 中的 AJAX 发出?