Laravel 5补丁请求通过ajax

时间:2015-04-17 13:26:20

标签: php ajax laravel patch

我有一个帖子的评论列表,我希望用户能够根据需要编辑他们的帖子。在列表中有一个编辑按钮(如果帖子属于登录的用户),单击时会发出ajax-request并返回一个视图。此视图包含用于编辑注释的表单,并预先加载了注释详细信息。到目前为止一切运作良好。

现在,我遇到了一个不明确的问题。当我想使用PATCH请求提交表单时,它会失败并显示错误500.结构如下所示:

  • 用户访问/posts/{id}在此视图中,列出了所有评论。

  • 当用户点击编辑按钮时 /posts/{id}/comments/{comment_id}/edit被调用,视图与 表格被退回

  • 当用户提交此表单时 Route::patch('/posts/{id}/comments/{comment_id}/edit', ['as' => 'posts.editComment', 'uses' => 'PostsController@update']是 触发。在那里失败了。

在Chrome中使用网络检查器,我可以点击错误。在那里,它告诉我有一个令牌不匹配?我没有修改任何令牌,仅使用默认表单。表格代码如下:

{!! Form::model($comment, ['method' => 'PATCH', 'route' => ['posts.editComment', $comment->post_id, $comment->id], 'id' => 'editComment' . $comment->id]) !!}
    <div class="comment-edit">
        {!! Form::textarea('comment', null, ['class' => 'form-control', 'style' => 'height: 80px;']) !!}
    </div>
    <div class="comment-edit-buttons text-right">
        {!! Form::button(trans('general.cancel'), ['class' => 'btn btn-default btn-sm cancelEditComment', 'data-postId' => $comment->post_id] ) !!}
        {!! Form::button(trans('general.edit'), ['class' => 'btn btn-primary btn-sm  editComment', 'data-postId' => $comment->post_id, 'data-commentId' => $comment->id] ) !!}
    </div>
{!! Form::close() !!}

它转换为浏览器:

<form method="POST" action="http://www.domain.com/posts/29/comments/12/edit" accept-charset="UTF-8" id="editComment12">
    <input name="_method" type="hidden" value="PATCH">
    <input name="_token" type="hidden" value="generated token value">
    <div class="comment-edit">
        <textarea class="form-control" style="height: 80px;" name="comment" cols="50" rows="10">nieuwe comment</textarea>
    </div>
    <div class="comment-edit-buttons text-right">
        <button class="btn btn-default btn-sm cancelEditComment" data-postId="29" type="button">Annuleren</button>
        <button class="btn btn-primary btn-sm  editComment" data-postId="29" data-commentId="12" type="button">Bewerken</button>
    </div>
</form>

我不确定在哪里看?是否有使用ajax发送PATCH请求的特殊方法?

1 个答案:

答案 0 :(得分:1)

您的问题与csfr_token的加密有关,在您的刀片文件中添加以下内容:

$encrypter = app('Illuminate\Encryption\Encrypter');
$encrypted_token = $encrypter->encrypt(csrf_token());

然后将以下字段添加到表单中:

<input id="token" type="hidden" value="{{$encrypted_token}}">

最后确保将原始csfr标记添加到标题中,如下所示:

<script>
.....
var $_token = $('#token').val();
....
$.ajax({
                type: 'post',
                cache: false,
                headers: { 'X-XSRF-TOKEN' : $_token }, 
                url: 'the_url_to_controller_thru_route/' + some_parameters_if_needed,
                //contentType: "application/json; charset=utf-8",
                //dataType: 'json',
                data: {comment_id: 873}, //assuming that you send some data like id of a comment to controller 
                                success: function(data) {
....
</script>

Ben,如果您发现错误,请编辑我的答案,最好尽可能准确。