laravelでの削除機能の実装

1.目的

投稿したものを削除できるようにしていきます。

2.必要なもの

なし

3.手順

①show.blade.phpに以下のように追記し削除ボタンを追加実装します。

<div>{{ $item->name }}</div>
<div>{{ $item->url }}</div>
<div>{{ $item->text }}</div>
//以下追記
<form action="{{ url('item/'.$item->id) }}" method="post">
 @csrf
 @method('DELETE')
 <button type="submit" class="btn item-destroy">
   削除
 </button>
</form>
//ここまで

@csrfは、ログイン認証後のフォームには基本つけます。

HTMLフォームでは、GETもしくはPOSTのみが許可されています。そのため、フォームのDELETEリクエストを使う場合は、擬似的に使う方法をとります。
具体的には、フォームの中で、@method('DELETE')関数の結果を出力することによりDELETEリクエストとして見せかけることができます。
laravelはこれを認識し、実際のHTTPリクエストメソッドをオーバーライドをします。以下の内容が生成っされます。

<input type="hidden" name="_method" value="DELETE">

他にもfigure1のような疑似フォームメソッドが用意されています。

図1

②削除するためのルーティングを記述します。

<?php
use Illuminate\Support\Facades\Route;
use Illuminate\Http\Request;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', 'ItemsController@index');
//以下にdestroyアクションを加えます。
Route::resource('/item','ItemsController',['only' =>['create','store','show','destroy']]);
//ここまで
Auth::routes();
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');

③ItemsControllerを以下のように変更し、削除処理を追加していきます。

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Item;
use Validator;

class ItemsController extends Controller
{
   /**
    * Display a listing of the resource.
    *
    * @return \Illuminate\Http\Response
    */
   public function index()
   {
       $items = Item::orderBy('created_at','desc')->get();
       return view('items.index',compact('items'));
       
   }
   /**
    * Show the form for creating a new resource.
    *
    * @return \Illuminate\Http\Response
    */
   public function create()
   {
       return view('items.create');
   }
   /**
    * Store a newly created resource in storage.
    *
    * @param  \Illuminate\Http\Request  $request
    * @return \Illuminate\Http\Response
    */
   public function store(Request $request)
   {
       $validator = Validator::make($request->all(),[
           'name' => 'required',
           'url' => 'required',
           'text' => 'required',
       ]);
       if($validator->fails()){
           return redirect('item/create')
               ->withInput()
               ->withErrors($validator);
       }
       $items = new Item;
       $items->name = $request->name;
       $items->url = $request->url;
       $items->text = $request->text;
       $items->save();
       return redirect('/');
   }
   public function show($id) {
       $item = Item::findOrFail($id);
       return view('items.show')->with('item', $item);
   }
   //以下追加
   public function destroy($id){
       $item = Item::findOrFail($id);
       $item->delete();
       return redirect('/');
   }
   //ここまで
   /**
    * Display the specified resource.
    *
    * @param  int  $id
    * @return \Illuminate\Http\Response
    */
   
}

レコードを削除するためにdelete()メソッドを使用しています。

4.まとめ

これにて削除機能の実装の完成です。
以下のように削除することができたらOK!!です。
ありがとうございました。

画像2


この記事が気に入ったらサポートをしてみませんか?