laravel 5.2有效的ajax请求


laravel 5.2 valid ajax request

如果请求是有效的ajax请求,我们如何在Laravel 5.2中进行检查。在codeigniter中,我们可以像$this->input->is_ajax_request()那样检查它。Laravel 5.2有类似的东西吗?

此外,我想知道我们如何验证csrf令牌的请求。如果我让我的网页通过"web"中间件渲染,生成一个csrf令牌,然后将该令牌作为ajax请求参数传递,这可以吗?Laravel会负责验证代币吗?或者有其他方法吗?

我已经查看了laravel 5.2文档,由于这是我第一次处理laravel框架,文档似乎假设读者已经熟悉了该框架的早期版本。对于像我这样的新人来说,这有点让人不知所措。

提前谢谢。如果你需要我的更多输入,请告诉我。

Prakhar

我认为这可能会帮助您取消对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包,其中令牌作为隐藏输入传递。

在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;

如果请求是有效的ajax请求,我们如何在Laravel 5.2中进行检查。在codeigniter中,我们可以像$this->input->is_ajax_request()那样检查它。Laravel 5.2有类似的东西吗?

Request类有一个ajax()函数,所以$request->ajax()Request::ajax()(取决于您在控制器中获取请求的方式)会起作用。

此外,我想知道我们如何验证csrf令牌的请求。如果我让我的网页通过"web"中间件渲染,生成一个csrf令牌,然后将该令牌作为ajax请求参数传递,这可以吗?Laravel会负责验证代币吗?或者有其他方法吗?

是的,通过AJAX调用传递令牌,并确保您的路由具有CSRF中间件(尝试一个没有令牌的请求,它应该会抛出一个错误)。文档中的示例如下:https://laravel.com/docs/5.2/routing#csrf-x-csrf-token

在应用程序中定义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>