質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
SVG

SVGは、XMLを基盤とした2Dベクター画像記述言語。画像を線・面といった図形の集合体として扱うベクター画像のため、環境に適した表示が可能です。アニメーション機能もサポートされており、簡単なインタラクティブコンテンツ作成もできます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

2回答

2605閲覧

[Laravel]The DELETE method is not supported for・・・

saitou_san

総合スコア32

SVG

SVGは、XMLを基盤とした2Dベクター画像記述言語。画像を線・面といった図形の集合体として扱うベクター画像のため、環境に適した表示が可能です。アニメーション機能もサポートされており、簡単なインタラクティブコンテンツ作成もできます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2023/06/26 01:51

編集2023/06/26 02:47

実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

<form action=・・・と表記すべきところを<form acction= …と表記しているのが原因でした。

投稿2023/06/26 03:17

saitou_san

総合スコア32

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

この回答はGPT-4による自動生成回答です

weetId)->first();
$tweet->delete();

return redirect()->route('tweet.index')->with('success', 'ツイートを削除しました。'); }

}

### 解説 DELETEメソッドは、HTTPリクエストのメソッドの1つで、リソースの削除をリクエストするために使用されます。POSTメソッドは、リソースの作成や更新に使用されることが一般的ですが、削除にはDELETEメソッドを使用することが推奨されています。これにより、リクエストの目的が明確になり、コードの可読性が向上します。 上記のコードでは、`index.blade.php`でフォームを作成し、`@method('delete')`でDELETEメソッドを指定しています。また、`@csrf`でCSRFトークンを埋め込んでいます。これにより、フォームが送信されると、`/tweet/delete/{tweetId}`のURLにDELETEリクエストが送信されます。 `routes/web.php`では、`/tweet/delete/{tweetId}`のURLに対して、`Tweet\DeleteController`が呼び出されるようにルーティングが設定されています。 `Tweet\DeleteController`では、`__invoke`メソッドが実行され、リクエストから`tweetId`を取得し、`TweetService`を使ってツイートの所有者がログインユーザーと一致するかどうかをチェックしています。一致しない場合は、`AccessDeniedHttpException`がスローされます。一致する場合は、ツイートが削除され、ツイート一覧ページにリダイレクトされます。

投稿2023/06/26 01:52

teratail-ai

Powered by GPT-4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問