CRUD Laravel 5 Comment lier pour détruire le contrôleur de ressources?

j'ai un lien

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

ce lien est supposé diriger vers la méthode destroy du Controller Usercontroller , c'est ma route Route::resource('/user', 'BackEndUsersController');

UserController est un contrôleur de ressources. Mais en ce moment, il me dirige vers la méthode du spectacle plutôt que vers la méthode de destruction!--3-->

18
demandé sur xenish 2015-05-18 12:13:33

9 réponses

c'est parce que vous demandez les ressources via la méthode GET à la place de la méthode DELETE. Regardez:

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

les deux routes ont la même URL, mais le verbe d'en-tête identifie l'appel. Regarde le RESTful table. Par exemple, via ajax vous pouvez ENVOYER UNE DEMANDE DE SUPPRESSION:

$.ajax({
    url: '/user/4',
    type: 'DELETE',  // user.destroy
    success: function(result) {
        // Do something with the result
    }
});
15
répondu manix 2015-05-18 09:25:04

vous devez envoyer un DELETE demande au lieu d'un GET demande. Vous ne pouvez pas faire cela avec un lien, donc vous devez utiliser une demande AJAX ou un formulaire.

Voici la méthode de formulaire Générique:

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

Si vous utilisez Laravel 5.1 ou version ultérieure alors vous pouvez utiliser les helpers intégrés de Laravel pour raccourcir votre code:

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

Si vous utilisez Laravel 5.6 ou plus tard alors vous pouvez utiliser les nouvelles directives Blade pour raccourcir votre code encore plus loin:

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

vous pouvez en savoir plus sur méthode de mystification à Laravel ici.

20
répondu BrokenBinary 2018-06-21 18:31:02

j'ai utiliser ce modèle " resources/views/utils/supprimer.lame.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>

Appelé comme ceci:

@include('utils.delete',array( 'url' => URL::route('user.destroy',$id),'text' => '<span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span> delete me'))
13
répondu Damien Labat 2016-11-22 16:02:59

si vous cherchez à faire cela via un lien régulier au lieu de via AJAX ou un autre type de demande de formulaire, vous pouvez configurer une route spéciale qui répondra à un normal GET demande:

dans vos routes, définissez ceci en plus de la ressource:

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

selon vous:

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

Dans votre contrôleur:

public function destroy(User $user)
{
  $user->delete();
  return redirect()->route('users.index');
}
9
répondu Denny 2016-11-27 06:25:18

si nous avons besoin d'utiliser une ancre pour déclencher la route de destruction, et nous ne voulons pas utiliser ajax, nous pouvons mettre un formulaire à l'intérieur de notre lien, et soumettre le formulaire en utilisant le onclick l'attribut:

<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>
2
répondu Moppo 2016-09-22 13:50:32

si vous voulez vraiment visiter l'action destroy sur la route delete par HTML, alors il y a une approche pour utiliser la mystification de la méthode HTTP qui signifie que vous pouvez visiter une méthode HTTP delete en ajoutant une entrée cachée nommée _method avec la valeur de la"SUPPRIMER". La même méthode peut être utilisée pour la méthode HTTP "PUT" et "PATCH".

ci-dessous est un exemple pour supprimer la méthode.

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

obtenir l'itinéraire

DELETE  /tasks/{id}  destroy     tasks.destroy

si vous utilisez laravel collective, vous pouvez écrire de cette façon votre point de vue.

{!! Form::open(['url' => '/tasks/'.$cat->id, 'method' => 'delete']) !!}
{!! Form::submit('Delete', ['class' => 'btn btn-primary']) !!}
{!! Form::close() !!}
1
répondu Fang DaHong 2018-01-17 22:06:21

si vous voulez utiliser un lien, vous pouvez utiliser une bibliothèque que j'ai créée qui permet aux gens de créer des liens qui se comportent comme POST, DELETE... appeler.

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

0
répondu Patroklo 2018-01-17 22:07:25

dans le cas où quelqu'un est venu ici pour trouver comment remplacer le formulaire laravel standard pour supprimer, à partir du bouton en elle de lien, vous pouvez juste remplacer:

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

il suffit de remplacer le bouton par simple <a href="#"... mais onclick attribut pour soumettre le formulaire!

0
répondu Gediminas 2018-02-23 18:36:20

GET et DELETE les deux routes ont la même URL, mais le verbe en-tête identifie l'appel.

Voici mes extraits de code pour éditer et supprimer. J'utilise la confirmation modale bootstrap pour supprimer l'action

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

BootStrap Modal

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

et enfin JS code

$('.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();
});
0
répondu Hassan Jamal 2018-02-24 18:27:42