如果请求是有效的ajax请求,我们如何检查Laravel 5.2。在codeigniter中,我们可以像$ this-> input-> is_ajax_request()一样检查它。 Laravel 5.2有类似之处吗?
另外,我想知道我们如何验证对csrf令牌的请求。如果我让我的网页通过“网络”进行渲染,这样会很好吗?中间件生成csrf令牌,然后将此令牌作为ajax请求参数传递? Laravel是否会负责验证令牌?或者是否有替代方法?
我已经检查了laravel 5.2文档,因为这是我第一次处理laravel框架,似乎文档假定读者已经熟悉框架的早期版本。对于像我这样的新人来说,这有点压倒性。
提前致谢。如果您需要我更多的意见,请告诉我。
Prakhar
答案 0 :(得分:7)
我认为这可能会帮助您找到一种在Laravel中使用AJAX的基本方法。
这是一段非常古老的代码,但它的工作原理是jajajaja
控制器端:
/**
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function getRamos(Request $request)
{
$check = Ramo::find($request->input('ramo'));
$subramos = Subramo::where('ramo_id', $check->id)->get(['nombre_subramo']);
if($request->ajax()){
return response()->json([
'subramos' => $subramos
]);
}
}
在前面:
<script>
$(document).ready(function(){
$('#ramo').change(function(){
var ramo, token, url, data;
token = $('input[name=_token]').val();
ramo = $('#ramo').val();
url = '{{route('getRamos')}}';
data = {ramo: ramo};
$('#subramos').empty();
$.ajax({
url: url,
headers: {'X-CSRF-TOKEN': token},
data: data,
type: 'POST',
datatype: 'JSON',
success: function (resp) {
$.each(resp.subramos, function (key, value) {
$('#subramos').append('<option>'+ value.nombre_subramo +'</option>');
});
}
});
});
});
</script>
将“#ramo”视为选择输入并使用style / html包,其中令牌作为隐藏输入传递。
答案 1 :(得分:2)
在Laravel 5.2中(我希望任何团体从Ajax的代码中获得帮助)
在函数中获取ajax请求,函数的两个例子是:
第一个例子
public function getLev() {
if (!Request::ajax())
return false;
$result = Input::all();
$lev_id = (int) $result['lev_id'];
$invoiceid = (int) $result['invoiceid'];
return SuppliersController::getLev($invoiceid,$lev_id);//you can do any thing with your variables
//function is working in my case, you case take idea from this function
}
第二个例子
public function deleteInvoice() {
if (Request::ajax()) {
$data = Input::all();
return delete_invoice($data['invoice_id'], $data['reason_text']);//you can do any thing with your variables
}
return false;
//function is working in my case, you case take idea from this function
}
将这些文件包含在您在上面写入ajax相关函数的页面/控制器的顶部:
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Request;
答案 2 :(得分:0)
如果请求是有效的ajax请求,我们如何检查Laravel 5.2。在codeigniter中,我们可以像$ this-&gt; input-&gt; is_ajax_request()一样检查它。 Laravel 5.2有类似之处吗?
Request类有an ajax()
function,因此$request->ajax()
或Request::ajax()
(取决于您在控制器中获取请求的方式)将会有效。
另外,我想知道我们如何验证对csrf令牌的请求。如果我让我的网页通过“网络”进行渲染,这样会很好吗?中间件生成csrf令牌,然后将此令牌作为ajax请求参数传递? Laravel是否会负责验证令牌?或者是否有替代方法?
是的,使用AJAX调用传递令牌并确保您的路由具有CSRF中间件(尝试没有令牌的请求 - 它应该抛出错误)。示例出现在以下文档中:https://laravel.com/docs/5.2/routing#csrf-x-csrf-token
答案 3 :(得分:0)
无论何时在应用程序中定义HTML表单,都应在表单中包含隐藏的CSRF令牌字段,以便CSRF保护中间件能够验证请求。
要生成包含CSRF令牌的隐藏输入字段_token,您可以使用csrf_field辅助函数:
因此,要使用POST方法使用AJAX请求,您需要传递隐藏的CSRF令牌字段以及ajax数据:
<script>
var token="<?php echo csrf_token(); ?>";
$.ajax({
url:url,
method:'POST',
data:{
'_token':token,
'id':1
}
})
</script>