laravel 5.2 有效 ajax 请求

laravel 5.2 valid ajax request

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

另外,我想知道我们如何验证对 csrf 令牌的请求。如果我让我的网页通过生成 csrf 令牌的 'web' 中间件呈现,然后将此令牌作为 ajax 请求参数传递,是否可以? Laravel 会负责验证令牌还是有替代方法?

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

提前致谢。如果您需要我提供更多信息,请告诉我。

普拉卡

How can we check in Laravel 5.2 if a request is a valid ajax request. In codeigniter ,we could check it like $this->input->is_ajax_request(). Does, Laravel 5.2 has something similar?

请求 class 有 an ajax() function,因此 $request->ajax()Request::ajax()(取决于您在控制器中获取请求的方式)可以解决问题。

Also, I would like to know that how can we validate a request for csrf token. Is it fine if I let my webpage render through the 'web' middleware generating a csrf token and then pass this token as ajax request parameter? Would Laravel take care of validating the token or is there an alternate way around this?

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

我认为这可能会帮助您理解将 AJAX 与 Laravel 结合使用的一种非常基本的方法。

这是一段非常古老的代码,但它确实有效 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”作为 select 输入并使用样式 / 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
}

将这些文件包含在 page/controller 上面的 ajax 相关函数之上:

use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Request;

任何时候在应用程序中定义 HTML 表单时,都应该在表单中包含一个隐藏的 CSRF 令牌字段,以便 CSRF 保护中间件能够验证请求。

要生成包含 CSRF 令牌的隐藏输入字段 _token,您可以使用 csrf_field 辅助函数:

因此,要使用 AJAX 请求和 POST 方法,您需要传递隐藏的 CSRF 令牌字段以及 ajax 数据:

<script>

var token="<?php echo csrf_token(); ?>";

$.ajax({

  url:url,
  method:'POST',
  data:{
    '_token':token,
    'id':1    
  }


})

</script>