web-dev-qa-db-fra.com

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 censé diriger vers la méthode de destruction de l'Usercontroller, c'est ma route Route::resource('/user', 'BackEnd\UsersController');

UserController est un contrôleur de ressources. Mais à ce moment, il m’adresse à la méthode show plutôt qu’à la méthode destroy

18
xenish

En effet, 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 itinéraires ont la même URL, mais le verbe d’en-tête identifie laquelle appeler. Regarde la table RESTful . Par exemple, via ajax, vous pouvez envoyer une demande DELETE:

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

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

Voici la méthode du 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, vous pouvez utiliser les assistants 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 une version ultérieure, vous pouvez utiliser les nouvelles directives Blade pour raccourcir davantage votre code:

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

Vous pouvez en savoir plus sur la méthode spoofing à Laravel ici.

25
BrokenBinary

J'utilise ce modèle 'ressources/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>

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

Si vous souhaitez le faire via un lien régulier au lieu de AJAX ou un autre type de demande de formulaire, vous pouvez configurer un itinéraire spécial qui répond à une demande GET normale:

Dans vos itinéraires, définissez ceci en plus de la ressource:

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

A votre avis:

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

Si nous devons utiliser une ancre pour déclencher la route de destruction et si nous ne voulons pas utiliser ajax, nous pouvons insérer un formulaire dans notre lien et le soumettre à l'aide de l'attribut 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>
2
Moppo

Si vous voulez vraiment visiter l'action de destruction sur delete route en HTML, il existe une approche pour utiliser HTTP Method Spoofing, ce qui signifie que vous pouvez visiter une méthode HTTP delete en ajoutant une entrée cachée nommée _method avec la valeur `" DELETE " . La même manière peut être utilisée pour les méthodes HTTP "PUT" et "PATCH".

Vous trouverez ci-dessous un exemple de méthode DELETE.

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

obtiendra la route

DELETE  /tasks/{id}  destroy     tasks.destroy

si vous utilisez laravel collectif, vous pouvez écrire de cette façon dans vos vues.

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

Ma version non-ajax. Je l'utilise dans les listes déroulantes (bootstrap) de la liste des ressources (datatables également). Très court et universel.

Méthode globale jQuery:

$('.submit-previous-form').click(function (e) {
    e.preventDefault();
    $($(this)).prev('form').submit();
});

Et ensuite, nous pouvons utiliser partout quelque chose comme ceci:

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

Recommander: Il est facile d'intégrer des scripts de confirmation, par exemple swal.

0
Marek Gralikowski

GETetDELETELes deux routes ont la même URL, mais le verbe d’en-tête identifie celle à appeler. 

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

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

Modal BootStrap

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

Au cas où quelqu'un viendrait ici pour trouver comment remplacer le formulaire laravel standard pour la suppression, vous pouvez simplement 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 le simple <a href="#"... mais par l'attribut onclick pour soumettre le formulaire!

0
Gediminas

Si vous souhaitez utiliser un lien, vous pouvez utiliser une bibliothèque que j'ai créée et permettant aux utilisateurs de créer des liens qui se comportent comme des appels POST, DELETE ....

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

0
Patroklo