web-dev-qa-db-ja.com

ルートでDELETEメソッドを使用してLaravel 5.4

Laravel(v 5.4)プロジェクトに取り組んでいます。カテゴリを管理するためにCRUDを実行しました。現在、新しいカテゴリを作成でき、削除できます。

カテゴリを削除するビュー(ブレード付き)を作成しました。

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

そして、ルーティングファイルweb.phpで、私は書きました:

Route::delete('/categories/{id}', CategoryController@destroy);

カテゴリを削除し、カテゴリのリストにリダイレクトするdestroy()メソッドを備えたController CategoryControllerがあります。しかし、削除するボタンをクリックすると、このルートが定義されていないことを説明するエラーが表示されます。 Route::deleteRoute::getで置き換えると機能します。 URLはGETで呼び出されると思いますが、他のアクションのためにそれを保持します。

リンクをフォームに置き換え、「method」属性の値として「DELETE」を試みましたが、機能しませんでした。

DELETEメソッドでURLを呼び出してRoute::deleteでキャッチするにはどうすればよいですか?

前もって感謝します。

11
Needlle

URLをクリックすると、常にGETメソッドになります。

DELETEとして定義したいので、投稿フォームに作り直して追加する必要があります

<input type="hidden" name="_method" value="delete" />

初期化。交換のように:

<a href="{{ url('/categories', ['id' => $category->id]) }}">
    <button class="btn btn-default">Delete</button>
</a>

で:

<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" />
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>

PUTリクエストについても同様です。

Laravel 5.1 method_fieldから:

<form action="{{ url('/categories', ['id' => $category->id]) }}" method="post">
    <input class="btn btn-default" type="submit" value="Delete" />
    {!! method_field('delete') !!}
    {!! csrf_field() !!}
</form>

Laravel 5.6が@タグだけであるため:

<form action="{{ url('/categories', ['id' => $category->id]) }}" method="post">
    <input class="btn btn-default" type="submit" value="Delete" />
    @method('delete')
    @csrf
</form>
16
Peon

laravel 5.7の場合、私の例を見てください:

<form action="{{route('statuses.destroy',[$order_status->id_order_status])}}" method="POST">
 @method('DELETE')
 @csrf
 <button type="submit">Delete</button>               
</form>
3
user5510975

GETおよびPOST以外のメソッドでは、非表示フォーム入力を使用してメソッドタイプを指定する必要があります。 laravelがそれらを検出する方法です。あなたの場合、フォームを使用して削除アクションを送信する必要があります。これを行います。

<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