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のような疑似フォームメソッドが用意されています。
②削除するためのルーティングを記述します。
<?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!!です。
ありがとうございました。
この記事が気に入ったらサポートをしてみませんか?