実現したいこと
Laravelにおいて、DELETEメソッドでリクエストを送り、投稿主が一致したら該当するツイートを削除する処理をしたい
追記
DELETEメソッドでリクエストを送り意味も教えていただければ幸いです。
POSTではダメなんですか?
コード
index.blade.phpの一部
php
1<form acction="{{ route('tweet.delete', ['tweetId' => $tweetId]) }}" 2 method="post" onclick="return confirm('削除してもよろしいですか?');"> 3 @method('delete') 4 @csrf 5 <button type="submit" class="flex items-center w-full pt-1 6 pb-1 pl-3 pr-3 hover:bg-gray-100"> 7 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6"> 8 <path stroke-linecap="round" stroke-linejoin="round" d="M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 9 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0" /> 10 </svg> 11 <span>削除</span> 12 </button> 13 </form>
ブラウザの検証画面
html
1<form acction="http://localhost/tweet/delete/12" method="post" onclick="return confirm('削除してもよろしいですか?');"> 2 <input type="hidden" name="_method" value="DELETE"> <input type="hidden" name="_token" value="dHrtkFr1gXwANU6xvJvWJzk4E0t1RfJE9WhLHNhf"> <button type="submit" class="flex items-center w-full pt-1 3 pb-1 pl-3 pr-3 hover:bg-gray-100"> 4 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6"> 5 <path stroke-linecap="round" stroke-linejoin="round" d="M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 6 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0"></path> 7 </svg> 8 <span>削除</span> 9 </button> 10 </form>
routes/web.php
php
1<?php 2 3use App\Http\Controllers\ProfileController; 4use Illuminate\Support\Facades\Route; 5 6/* 7|-------------------------------------------------------------------------- 8| Web Routes 9|-------------------------------------------------------------------------- 10| 11| Here is where you can register web routes for your application. These 12| routes are loaded by the RouteServiceProvider and all of them will 13| be assigned to the "web" middleware group. Make something great! 14| 15*/ 16 17Route::get('/', function () { 18 return view('welcome'); 19}); 20 21// Sample 22Route::get('/sample', [\App\Http\Controllers\Sample\IndexController::class,'show']); 23Route::get('/sample/{id}', [\App\Http\Controllers\Sample\IndexController::class,'showId']); 24 25// Tweet 26Route::get('/tweet', \App\Http\Controllers\Tweet\IndexController::class) 27->name('tweet.index'); 28Route::middleware('auth')->group(function () { 29Route::post('/tweet/create', \App\Http\Controllers\Tweet\CreateController::class) 30->name('tweet.create'); 31Route::get('/tweet/update/{tweetId}', \App\Http\Controllers\Tweet\Update\IndexController::class) 32->name('tweet.update.index'); 33Route::put('/tweet/update/{tweetId}', \App\Http\Controllers\Tweet\Update\PutController::class) 34->name('tweet.update.put'); 35Route::delete('/tweet/delete/{tweetId}', \App\Http\Controllers\Tweet\DeleteController::class) 36->name('tweet.delete'); 37}); 38 39 40Route::get('/dashboard', function () { 41 return view('dashboard'); 42})->middleware(['auth', 'verified'])->name('dashboard'); 43 44Route::middleware('auth')->group(function () { 45 Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit'); 46 Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update'); 47 Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy'); 48}); 49 50require __DIR__.'/auth.php';
\App\Http\Controllers\Tweet\DeleteController
php
1<?php 2# ツイートを削除する 3 4namespace App\Http\Controllers\Tweet; 5 6use App\Http\Controllers\Controller; 7use Illuminate\Http\Request; 8use App\Models\Tweet; 9use App\Services\TweetService; 10use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; 11 12class DeleteController extends Controller 13{ 14 /** 15 * Handle the incoming request. 16 */ 17 public function __invoke(Request $request, TweetService $tweetService) 18 { 19 $tweetId = (int) $request->route('tweetId'); 20 if (!$tweetService->checkOwnTweet($request->user()->id, $tweetId)) { 21 throw new AccessDeniedHttpException(); 22 } 23 $tweet = Tweet::where('id', $tweetId)->firstOrFail(); 24 $tweet->delete(); 25 return redirect() 26 ->route('tweet.index') 27 ->with('feedback.success', "つぶやきを削除しました"); 28 } 29}
発生している問題・エラーメッセージ
削除を押すとエラーメッセージが表示されます。
The DELETE method is not supported for route tweet. Supported methods: GET, HEAD.
試したこと
http://taustation.com/laravel-deleting-data/
を参考に\App\Http\Controllers\Tweet\DeleteControllerにdestroyメソッドを追加してみました。
(__invokeと同じ処理)
\App\Http\Controllers\Tweet\DeleteController
php
1<?php 2# ツイートを削除する 3 4namespace App\Http\Controllers\Tweet; 5 6use App\Http\Controllers\Controller; 7use Illuminate\Http\Request; 8use App\Models\Tweet; 9use App\Services\TweetService; 10use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; 11 12class DeleteController extends Controller 13{ 14 /** 15 * Handle the incoming request. 16 */ 17 public function __invoke(Request $request, TweetService $tweetService) 18 { 19 $tweetId = (int) $request->route('tweetId'); 20 if (!$tweetService->checkOwnTweet($request->user()->id, $tweetId)) { 21 throw new AccessDeniedHttpException(); 22 } 23 $tweet = Tweet::where('id', $tweetId)->firstOrFail(); 24 $tweet->delete(); 25 return redirect() 26 ->route('tweet.index') 27 ->with('feedback.success', "つぶやきを削除しました"); 28 } 29 30 public function destroy(Request $request, TweetService $tweetService) 31 { 32 $tweetId = (int) $request->route('tweetId'); 33 if (!$tweetService->checkOwnTweet($request->user()->id, $tweetId)) { 34 throw new AccessDeniedHttpException(); 35 } 36 $tweet = Tweet::where('id', $tweetId)->firstOrFail(); 37 $tweet->delete(); 38 return redirect() 39 ->route('tweet.index') 40 ->with('feedback.success', "つぶやきを削除しました"); 41 } 42}
が、同じエラーメッセージが出力されました。
routes\web.phpのルートをpostに変更し、
index.blade.phpから@method('delete')を削除しました。
index.blade.phpの一部
php
1<form acction="{{ route('tweet.delete', ['tweetId' => $tweetId]) }}" 2 method="post" onclick="return confirm('削除してもよろしいですか?');"> 3 @csrf 4 <button type="submit" class="flex items-center w-full pt-1 5 pb-1 pl-3 pr-3 hover:bg-gray-100"> 6 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-6 h-6"> 7 <path stroke-linecap="round" stroke-linejoin="round" d="M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 8 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0" /> 9 </svg> 10 <span>削除</span> 11 </button> 12 </form>
routes\web.php
php
1Route::post('/tweet/delete/{tweetId}', \App\Http\Controllers\Tweet\DeleteController::class) 2->name('tweet.delete'); 3});
→エラーメッセージが変わりました。
The POST method is not supported for route tweet. Supported methods: GET, HEAD.
追記
エラーを見たところ、
php
1Route::delete('/tweet/delete/{tweetId}', \App\Http\Controllers\Tweet\DeleteController::class) 2->name('tweet.delete');
ではなく、
php
1Route::get('/tweet', \App\Http\Controllers\Tweet\IndexController::class) 2->name('tweet.index');
にリクエストが行ってるみたいです。
補足情報(FW/ツールのバージョンなど)
Laravel Framework 10.13.5
VITE v4.3.9
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。