laravel 5.2有效的ajax请求

时间:2016-01-03 00:57:22

标签: php ajax laravel-5.2

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

另外,我想知道我们如何验证对csrf令牌的请求。如果我让我的网页通过“网络”进行渲染,这样会很好吗?中间件生成csrf令牌,然后将此令牌作为ajax请求参数传递? Laravel是否会负责验证令牌?或者是否有替代方法?

我已经检查了laravel 5.2文档,因为这是我第一次处理laravel框架,似乎文档假定读者已经熟悉框架的早期版本。对于像我这样的新人来说,这有点压倒性。

提前致谢。如果您需要我更多的意见,请告诉我。

Prakhar

4 个答案:

答案 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>