Laravel 5 补丁请求来自 ajax
Laravel 5 patch request via ajax
我有一个带有 post 的评论列表,我希望用户能够根据需要编辑他们的 post。在列表中有一个编辑按钮(如果 post 属于登录用户),单击时会发出 ajax 请求并返回一个视图。此视图包含用于编辑评论的表单,并预加载了评论详细信息。至此一切正常。
下面是我 运行 遇到一个不清楚的问题的部分。当我想使用 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 请求的特殊方法?
您的问题与 csfr_token 的加密有关,在您的 blade 文件中添加以下内容:
$encrypter = app('Illuminate\Encryption\Encrypter');
$encrypted_token = $encrypter->encrypt(csrf_token());
然后将以下字段添加到您的表单中:
<input id="token" type="hidden" value="{{$encrypted_token}}">
最后一定要将原来的csfr token添加到headers中,如下:
<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,如果您发现有什么不对,请编辑我的答案,最好尽可能准确。
我有一个带有 post 的评论列表,我希望用户能够根据需要编辑他们的 post。在列表中有一个编辑按钮(如果 post 属于登录用户),单击时会发出 ajax 请求并返回一个视图。此视图包含用于编辑评论的表单,并预加载了评论详细信息。至此一切正常。
下面是我 运行 遇到一个不清楚的问题的部分。当我想使用 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 请求的特殊方法?
您的问题与 csfr_token 的加密有关,在您的 blade 文件中添加以下内容:
$encrypter = app('Illuminate\Encryption\Encrypter');
$encrypted_token = $encrypter->encrypt(csrf_token());
然后将以下字段添加到您的表单中:
<input id="token" type="hidden" value="{{$encrypted_token}}">
最后一定要将原来的csfr token添加到headers中,如下:
<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,如果您发现有什么不对,请编辑我的答案,最好尽可能准确。