繁体   English   中英

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

[英]CRUD Laravel 5 how to link to destroy of Resource Controller?

我有链接

<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 方法

您需要发送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>

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

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

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

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

DELETE  /photo/{photo}  destroy     photo.destroy
GET     /photo/{photo}  show    photo.show

两条路由具有相同的 URL,但标头动词标识要调用的路由。 看起来是RESTful 表 例如,您可以通过 ajax 发送 DELETE 请求:

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

我使用这个模板'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>

调用如下:

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

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

在你的路由中,除了资源之外还定义了这个:

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

在您看来:

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

在您的控制器中:

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

如果我们需要使用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>

如果你真的想通过HTML访问delete路由上的destroy动作,那么有一种使用HTTP Method Spoofing的方法,这意味着你可以通过添加一个名为_method且值为`"DELETE"的隐藏输入来访问delete HTTP方法. 相同的方式可用于“PUT”和“PATCH”HTTP 方法。

下面是 DELETE 方法的示例。

<form action="/tasks/5" method="POST">
<input type="hidden" name="_method" value="DELETE">
</form>

会得到路线

DELETE  /tasks/{id}  destroy     tasks.destroy

如果你使用laravel集体,你可以在你的观点中这样写。

{!! 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' => 'return confirm("Are you sure?")', 'id'=>'himan']) !!}

    <a href="#" onclick="$(this).closest('form').submit();">Delete</a>

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

只需将按钮替换为简单的<a href="#"...但使用onclick属性来提交表单!

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

https://github.com/Patroklo/improved-links

GETDELETE两条路由具有相同的 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>

引导模式

<div class="modal fade" id="formConfirm" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
    <div class="modal-content">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span><span
                        class="sr-only">Close</span></button>
            <h4 class="modal-title" id="frm_title">Delete</h4>
        </div>
        <div class="modal-body" id="frm_body"></div>
        <div class="modal-footer">
            <button style='margin-left:10px;' type="button" class="btn btn-primary col-sm-2 pull-right"
                    id="frm_submit">Yes
            </button>
            <button type="button" class="btn btn-danger col-sm-2 pull-right" data-dismiss="modal" id="frm_cancel">
                No
            </button>
        </div>
    </div>
</div>

最后是JS代码

$('.formConfirm').on('click', function (e) {
  e.preventDefault();
  var el = $(this);
  var title = el.attr('data-title');
  var msg = el.attr('data-message');
  var dataForm = el.attr('data-form');

  $('#formConfirm')
    .find('#frm_body').html(msg)
    .end().find('#frm_title').html(title)
    .end().modal('show');

  $('#formConfirm').find('#frm_submit').attr('data-form', dataForm);
});

$('#formConfirm').on('click', '#frm_submit', function (e) {
  var id = $(this).attr('data-form');
  $(id).submit();
});

我的非 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>

推荐:很容易与确认脚本集成,例如 swal。

你可以试试这个:(你可以传递你的id)

<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() !!}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM