Laravel删除方法不使用DELETE动词

时间:2016-07-05 10:44:05

标签: laravel-5

在我的路线文件中,我有

  Route::delete('events/{events}', ['as' => 'events_delete', 'uses' => 'Admin\EventsController@destroy'] );

在我的视图文件中,我有

<a href="{!! route('events_delete', ['id' => $event->id ]) !!}" type="button" class="btn btn-sm btn-danger"><em class="fa fa-trash"></em></a>

这不起作用。当我将路线改为

  Route::get('events/{events}', ['as' => 'events_delete', 'uses' => 'Admin\EventsController@destroy'] );

确实有效。但是我不喜欢使用GET动词来删除项而不是DELETE动词。感觉就像一招......

如何更改表单代码以确保它发送DELETE谓词?

解决方案1(来自TheFallen):在路线文件中使用DELETE VERB

<form action="{!! route('events_delete', ['id' => $event->id ]) !!}" method="POST">
   {{ method_field('DELETE') }}
   {{ csrf_field() }}
   <button class="btn btn-danger btn-sm" type="submit"><em class="fa fa-trash"></em></button>
</form>

解决方案2:在路线文件中使用GET VERB

<a href="{!! route('events_delete', ['id' => $event->id ]) !!}" type="button" class="btn btn-sm btn-danger"><em class="fa fa-trash"></em></a>

2 个答案:

答案 0 :(得分:2)

您必须以这种方式发出删除请求才能使用该路由,您可以使用表单执行此操作,否则使用锚点您正在进行 get 请求

如果您还没有laravelcollective/html包,请从composer安装它以使用表单Facade。然后你可以这样发出请求:

    {!! Form::open(['method' => 'DELETE', 'route' => $yourRoute]) !!}
    {!! Form::submit('Delete') !!}
    {!! Form::close() !!}

修改

没有表格外观:

<form action="{{ $yourRoute }}" method="POST">
    {{ method_field('DELETE') }}
    {{ csrf_field() }}
    <button class="btn btn-danger btn-sm" type="submit"><em class="fa fa-trash"></em></button>
</form>

答案 1 :(得分:1)

这将产生一个GET请求,因此它不匹配Route :: delete

HTML表单不支持PUT,PATCH或DELETE操作。因此,在定义从HTML表单调用的PUT,PATCH或DELETE路由时,您需要向表单添加隐藏的_method字段。

参考:https://laravel.com/docs/master/routing#form-method-spoofing

要调用删除路由,必须使用jquery

实现
<a eventid="{{$event->id}}" href="#" type="button" class="btn btn-sm btn-danger"><em class="fa fa-trash"></em></a>

$(document).on("click",".anchorclass",function(e){
e.preventDefault();
if(!confirm("Are you sure?")) return;

 $.ajax({
            type: "DELETE",
            url: 'events/'+$(this).attr("eventid"),
            success: function(data) {
                //Process results
            }
        });

});