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