Je travaille sur un projet Laravel (v 5.4) et j'ai créé le CRUD pour gérer les catégories. Actuellement, je peux créer une nouvelle catégorie et je pourrais supprimer.
J'ai créé la vue (avec lame) pour supprimer les catégories:
<table class="table">
<thead>
<th>Name</th>
<th>Action</th>
</thead>
<tbody>
@foreach ($categories as $category)
<tr>
<td>$category->name</td>
<td>
<a href="{{ url('/categories', ['id' => $category->id]) }}">
<button class="btn btn-default">
Delete
</button>
</a>
</td>
</tr>
@endforeach
</tbody>
</table>
Et dans le fichier de routage web.php, j'ai écrit:
Route::delete('/categories/{id}', CategoryController@destroy);
J'ai un contrôleur CategoryController avec une méthode destroy () qui supprime la catégorie et redirige vers la liste des catégories. Mais lorsque je clique sur le bouton pour supprimer, j'obtiens une erreur expliquant que cette route n'est pas définie. Si je remplace Route::delete
par Route::get
cela fonctionne. Je pense que l'URL s'appelle avec GET mais je le garderais pour une autre action.
J'ai essayé de remplacer le lien par un formulaire et "DELETE" comme valeur de "méthode", mais cela n'a pas fonctionné.
Comment puis-je appeler l'URL avec la méthode DELETE pour l'attraper avec Route::delete
?
Merci d'avance.
Si vous cliquez sur une URL, ce sera toujours une méthode GET.
Puisque vous souhaitez le définir comme DELETE, vous devez le transformer en un formulaire et ajouter
<input type="hidden" name="_method" value="delete" />
en elle. Comme remplacer:
<a href="{{ url('/categories', ['id' => $category->id]) }}">
<button class="btn btn-default">Delete</button>
</a>
avec:
<form action="{{ url('/categories', ['id' => $category->id]) }}" method="post">
<input class="btn btn-default" type="submit" value="Delete" />
<input type="hidden" name="_method" value="delete" />
{!! csrf_field() !!}
</form>
Il en va de même pour la demande PUT.
Edit: Depuis Laravel 5.1, vous pouvez simplement ajouter: method_field('delete')
pour qu’il ressemble à
<form action="{{ url('/categories', ['id' => $category->id]) }}" method="post">
<input class="btn btn-default" type="submit" value="Delete" />
{!! method_field('delete') !!}
{!! csrf_field() !!}
</form>
Toute méthode autre que GET
et POST
nécessite que vous spécifiiez le type de méthode à l'aide d'une entrée de formulaire masquée. C'est comme ça que laravel les détecte. Dans votre cas, vous devez envoyer l'action de suppression à l'aide d'un formulaire. Fais ça.
<table class="table">
<thead>
<th>Name</th>
<th>Action</th>
</thead>
<tbody>
@foreach ($categories as $category)
<tr>
<td>$category->name</td>
<td>
<form action="/categories/{{ $category->id }}" method="post">
{{ method_field('delete') }}
<button class="btn btn-default" type="submit">Delete</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
Pour laravel 5.7, regardez mon exemple:
<form action="{{route('statuses.destroy',[$order_status->id_order_status])}}" method="POST">
@method('DELETE')
@csrf
<button type="submit">Delete</button>
</form>