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

xen*_*ish 21 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> 
Run Code Online (Sandbox Code Playgroud)

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

UserController是一个资源控制器.但此时它指示我使用show方法而不是指向destroy方法

Bro*_*ary 32

您需要发送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>
Run Code Online (Sandbox Code Playgroud)

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

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

如果您使用的是Laravel 5.6或更高版本,则可以使用新的Blade指令进一步缩短代码:

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

您可以在此处阅读有关Laravel中方法欺骗的更多信息.

  • 请注意,使用Laravel`5.6`时,您会再次使用较短的代码:`@ csrf`和`@method('DELETE')`(对我而言未经测试)。 (3认同)

man*_*nix 17

这是因为您通过GET方法而不是DELETE方法请求资源.看:

DELETE  /photo/{photo}  destroy     photo.destroy
GET     /photo/{photo}  show    photo.show
Run Code Online (Sandbox Code Playgroud)

两个路由都具有相同的URL,但标题动词标识要调用的路由.看起来REST风格的表.例如,通过ajax,您可以发送DELETE请求:

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

  • 通过网络浏览器,我不这么认为.你可以考虑制作一个控制器而不是资源.使用基本控制器,您可以声明一个可以删除用户的功能. (2认同)

Dam*_*bat 13

我使用这个模板'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>
Run Code Online (Sandbox Code Playgroud)

被称为:

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


Den*_*nny 10

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

在您的路由中,除资源外还要定义:

Route::get('user/{site}/delete', ['as' => 'user.delete', 'uses' => 'UserController@destroy']);
Run Code Online (Sandbox Code Playgroud)

在你看来:

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

在你的控制器中:

public function destroy(User $user)
{
  $user->delete();
  return redirect()->route('users.index');
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然这有效,但它会为GET请求分配破坏性操作,并且容易受到CSRF的攻击. (6认同)

Mop*_*ppo 5

如果我们需要使用anchor来触发destroy路由,又不想使用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>
Run Code Online (Sandbox Code Playgroud)