web-dev-qa-db-fra.com

utilisez la méthode DELETE en route avec Laravel 5.4

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.

8
Needlle

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

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

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