Php CRUD Laravel 5如何链接到资源控制器的销毁?

Php CRUD Laravel 5如何链接到资源控制器的销毁?,php,laravel,laravel-5,Php,Laravel,Laravel 5,我有一个链接 <a class="trashButton" href="{{ URL::route('user.destroy',$members['id'][$i]) }}" style="cursor: pointer;"><i class="fa fa-trash-o"></i></a> 这个链接应该指向Usercontroller的destroy方法,这是我的路由route::resource('/user','BackEnd\Us

我有一个链接

<a class="trashButton" href="{{ URL::route('user.destroy',$members['id'][$i]) }}" style="cursor: pointer;"><i class="fa fa-trash-o"></i></a> 

这个链接应该指向Usercontroller的destroy方法,这是我的路由
route::resource('/user','BackEnd\UsersController')


UserController是一个资源控制器。但此时它将我指向show方法而不是destroy方法,这是因为您是通过GET方法而不是DELETE方法请求资源的。看:

DELETE  /photo/{photo}  destroy     photo.destroy
GET     /photo/{photo}  show    photo.show
两个路由都有相同的URL,但标头谓词标识要调用的URL。看起来很像。例如,通过ajax,您可以发送删除请求:

$.ajax({
    url: '/user/4',
    type: 'DELETE',  // user.destroy
    success: function(result) {
        // Do something with the result
    }
});

您需要发送
DELETE
请求,而不是
GET
请求。您不能使用链接来实现这一点,因此必须使用AJAX请求或表单

以下是通用表单方法:

<form action="{{ URL::route('user.destroy', $members['id'][$i]) }}" method="POST">
    <input type="hidden" name="_method" value="DELETE">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    <button>Delete User</button>
</form>

删除用户
如果您正在使用Laravel 5.1或更高版本,则可以使用Laravel的内置帮助程序缩短代码:

<form action="{{ route('user.destroy', $members['id'][$i]) }}" method="POST">
    {{ method_field('DELETE') }}
    {{ csrf_field() }}
    <button>Delete User</button>
</form>

{{method_field('DELETE')}
{{csrf_field()}}
删除用户
如果您使用的是Laravel 5.6或更高版本,则可以使用新的Blade指令进一步缩短代码:

<form action="{{ route('user.destroy', $members['id'][$i]) }}" method="POST">
    @method('DELETE')
    @csrf
    <button>Delete User</button>
</form>

@方法('DELETE')
@csrf
删除用户

您可以阅读有关我使用此模板“resources/views/utils/delete.blade.php”的更多信息

<form action="{{ $url or Request::url() }}" method="POST">
    {{ method_field('DELETE') }}
    {{ csrf_field() }}
    <button type='submit' class="{{ $class or 'btn btn-danger' }}" value="{{ $value or 'delete' }}">{!! $text or 'delete' !!}</button>
</form>

{{method_field('DELETE')}
{{csrf_field()}}
{!!$text或“删除”!!}
称为:

@include('utils.delete',array( 'url' => URL::route('user.destroy',$id),'text' => '<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> delete me'))
@include('utils.delete',数组('url'=>url::route('user.destroy',$id),'text'=>'delete me'))

如果我们需要使用锚来触发销毁路径,并且我们不想使用ajax,我们可以在链接中放置一个表单,并使用
onclick
属性提交表单:

<a href="javascript:void(0);" onclick="$(this).find('form').submit();" >
    <form action="{{ url('/resource/to/delete') }}" method="post">
        <input type="hidden" name="_method" value="DELETE">
    </form>
</a>

如果您希望通过常规链接而不是通过AJAX或其他类型的表单请求执行此操作,您可以设置一个特殊的路由,以响应正常的
GET
请求:

在路线中,除资源外,还定义以下内容:

Route::get('user/{site}/delete', ['as' => 'user.delete', 'uses' => 'UserController@destroy']);
在你看来:

<a href="{{ route('user.delete', $user->id) }}">Delete this user</a>

如果你想使用一个链接,你可以使用我创建的一个库,它可以让人们创建类似POST、DELETE。。。电话


如果您确实想通过HTML访问delete route上的destroy操作,那么有一种使用HTTP方法欺骗的方法,这意味着您可以通过添加一个名为
\u Method
且值为“delete”的隐藏输入来访问delete HTTP方法。同样的方法也可以用于“PUT”和“PATCH”HTTP方法

下面是DELETE方法的示例

<form action="/tasks/5" method="POST">
<input type="hidden" name="_method" value="DELETE">
</form>
如果使用laravel collective,可以在视图中以这种方式编写

{!! Form::open(['url' => '/tasks/'.$cat->id, 'method' => 'delete']) !!}
{!! Form::submit('Delete', ['class' => 'btn btn-primary']) !!}
{!! Form::close() !!}

如果有人来这里想知道如何替换用于删除的标准laravel表单,从其中的按钮到链接,您只需替换:

{!! Form::open(['method' => 'DELETE', 'route' => ['tasks.destroy', $task->id],'onsubmit' => 'return confirm("Are you sure?")', 'id'=>'himan']) !!}

    {!! Form::submit('Delete') !!}

{!! Form::close() !!}

{!!Form::open(['method'=>'DELETE','route'=>['tasks.destroy',$task->id],'onsubmit'=>'返回确认(“确定吗?”),'id'=>'himan'])
{!!Form::close()!!}

只需将按钮替换为简单的
GETDELETE两个路由都有相同的URL,但标题动词标识要调用的URL

下面是我的编辑和删除代码片段。我对删除操作使用引导模式确认

<div class="btn-group">
  <a href="{{ route('locations.edit', $location->id) }}"
   class="btn btn-default btn-sm">
    <i class="fa fa-pencil"></i>
  </a>
  <span class="btn btn-danger btn-sm formConfirm"
      data-form="#frmDelete-{{$location->id}}"
      data-title="Delete Location"
      data-message="Are you sure you want to delete this Location ?">
      <i class="fa fa-times"></i>
  </span>
<form method="POST"
      style="display: none"
      id="frmDelete-{{$location->id}}"
      action="{{ route('locations.destroy' , $location->id) }}">
    {!! csrf_field() !!}
    {{ method_field('DELETE') }}
    <input type="submit">
</form>

我的,非ajax版本。我在资源列表(以及数据表)的下拉列表(引导)中使用它。非常简短和普遍

全局jQuery方法:

$('.submit-previous-form').click(function (e) {
    e.preventDefault();
    $($(this)).prev('form').submit();
});
然后我们可以在任何地方使用这样的东西:

{{ Form::open(['route' => ['user.destroy', $user], 'method' => 'delete']) }} {{ Form::close() }}
<a href="#" class="dropdown-item submit-previous-form" title="Delete user"><i class="icon-trash"></i> Delete him</a>
{Form::open(['route'=>['user.destroy',$user],'method'=>'delete'])}{{Form::close()}
推荐:很容易与确认脚本(例如swal)集成。

您可以尝试以下方法:(您可以传递您的id)

您的控制器:

public function destroy(User $user)
{
  $user->delete();
  return redirect()->route('users.index');
}
public function destroy($id)
{
    $task = Task::find($id);
    $task->delete();
    return redirect('/home')->with('success','Task Deleted Successfully');
}
或者你可以试试这个

 {!! Form::open(['method' => 'DELETE','route' => ['reports.destroy', $dummy->id],'class'=>'']) !!}
      {{ Form::button('<i class="bi bi-trash-fill" style="color:white"></i>', ['type' => 'submit', 'class' => 'delete get-started-btn-two'] )  }}
   {!! Form::close() !!}
{!!Form::open(['method'=>'DELETE','route'=>['reports.destroy',$dummy->id],'class'=>'')
{{Form::button('',['type'=>'submit','class'=>'delete get start btn two'])}n}
{!!Form::close()!!}

是否有一种方法可以通过URL::route发送该方法,以便laravel能够理解它是一种删除方法,而不是使用ajax或其他任何@manixVia web浏览器,我不这么认为。你可以考虑做一个控制器而不是资源。使用基本控制器,您可以声明一个可以删除用户的函数。@manix当我执行相同操作时,它会触发TokenMismatchException异常。即使我正在用ajax请求发送csrf令牌。请注意,输入字段可以分别缩短为
{method\u field(“DELETE”)}
{{csrf\u field()}
。@AI0867 True,如果您使用的是5.1版或更高版本。请注意,使用Laravel
5.6
时,您的代码又变短了:
@csrf
@method('DELETE')
(对不起,我这边没有测试过)。我如何使用ajax做到这一点?@LuísAlmeida您可以将ajax调用中的方法设置为
DELETE
,正如@manix接受的答案中所述,在这种情况下,它会对GET请求分配破坏性操作,并且容易受到CSRF的攻击。这是一种危险的行为。
{CSRF(field()}
{{method_field('FOO')}}
在使用Laravel 5.6时已过时,请参阅我的评论和上面的一些答案。
$('.submit-previous-form').click(function (e) {
    e.preventDefault();
    $($(this)).prev('form').submit();
});
{{ Form::open(['route' => ['user.destroy', $user], 'method' => 'delete']) }} {{ Form::close() }}
<a href="#" class="dropdown-item submit-previous-form" title="Delete user"><i class="icon-trash"></i> Delete him</a>
<form action="{{ route('tasks.destroy', $dummy->id) }}" method="post">
            @csrf
            @method('DELETE')
 <a href="#" class="btn btn-danger" title="Delete" data-toggle="tooltip" onclick="this.closest('form').submit();return false;">
              <i class="bi bi-trash-fill" style="color:white"></i>
           </a>
 </form>
Route::get('/tasks/delete/{id}', 'TasksController@destroy')
     ->name('tasks.destroy');
public function destroy($id)
{
    $task = Task::find($id);
    $task->delete();
    return redirect('/home')->with('success','Task Deleted Successfully');
}
 {!! Form::open(['method' => 'DELETE','route' => ['reports.destroy', $dummy->id],'class'=>'']) !!}
      {{ Form::button('<i class="bi bi-trash-fill" style="color:white"></i>', ['type' => 'submit', 'class' => 'delete get-started-btn-two'] )  }}
   {!! Form::close() !!}