Php 通过ajax请求Laravel 5修补程序

Php 通过ajax请求Laravel 5修补程序,php,ajax,laravel,patch,Php,Ajax,Laravel,Patch,我有一个评论与帖子列表,我希望用户能够编辑他们的帖子,如果他们想。在列表中有一个编辑按钮(如果帖子属于登录的用户),单击后会发出ajax请求并返回视图。此视图包含用于编辑注释的表单,并预加载了注释详细信息。在这一点上,一切都很好 现在我遇到了一个不清楚的问题。当我想使用补丁请求提交表单时,它失败了,错误为500。结构如下所示: 用户访问/posts/{id}在此视图中列出所有注释 当用户单击“编辑”按钮时 /posts/{id}/comments/{comment\u id}/edit被调用,

我有一个评论与帖子列表,我希望用户能够编辑他们的帖子,如果他们想。在列表中有一个编辑按钮(如果帖子属于登录的用户),单击后会发出ajax请求并返回视图。此视图包含用于编辑注释的表单,并预加载了注释详细信息。在这一点上,一切都很好

现在我遇到了一个不清楚的问题。当我想使用补丁请求提交表单时,它失败了,错误为500。结构如下所示:

  • 用户访问
    /posts/{id}
    在此视图中列出所有注释

  • 当用户单击“编辑”按钮时
    /posts/{id}/comments/{comment\u id}/edit
    被调用,具有 表格被退回

  • 当用户提交此表单时
    Route::patch('/posts/{id}/comments/{comment\u id}/edit',['as'=>
    'posts.editComment','使用'=>'PostsController@update“]
    触发。在这里是失败的
使用Chrome中的Network inspector,我可以单击错误。在那里,它告诉我令牌不匹配?我没有修改任何令牌,只是使用默认表单。表单代码如下:

{!! 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::model($comment,['method'=>'PATCH','route'=>['posts.editcoment',$comment->post\u id,$comment->id],'id'=>'editcoment'.$comment->id])
{!!Form::textarea('comment',null,['class'=>'表单控件','style'=>'高度:80px;'])
{!!Form::button(trans('general.cancel'),['class'=>'btn btn default btn sm canceleditcoment','data postId'=>$comment->post_id])
{!!Form::button(trans('general.edit'),['class'=>'btn btn primary btn sm editcoment','data postId'=>$comment->post_id',data commentId'=>$comment->id])
{!!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>

nieuwe评论
环烯
比沃肯

我真的不知道该去哪里看?是否有一种特殊的方法可以使用ajax发送补丁请求?

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

$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>

.....
var$_token=$('#token').val();
....
$.ajax({
键入:“post”,
cache:false,
标头:{'X-XSRF-TOKEN':$\U TOKEN},
url:“通过路由发送到控制器的url/”+一些参数(如果需要),
//contentType:“应用程序/json;字符集=utf-8”,
//数据类型:“json”,
数据:{comment_id:873},//假设您向控制器发送一些数据,如注释的id
成功:功能(数据){
....

Ben,如果你发现有什么问题,请编辑我的答案,最好是尽可能准确。

我在Laracasts上找到了这个讨论,向下滚动到Lukas post,他讨论了一个未加密的代币问题,这可能是你遇到的问题。谢谢,我会立即查看,并让你知道它是否有帮助。我没有我想你的链接有助于更进一步。但是现在我得到了一个405-方法,这是不允许的。当路由被定义并且控制器方法存在时..?你做了什么更改?你应该恢复到原来的状态,{{Form::open()}显然这是对的,这是正确的,除了我的ajax调用看起来不同之外。但是,如果有人稍后遇到相同的问题,这应该向他们指出解决方案:)干杯!