LoginSignup
0
0

More than 3 years have passed since last update.

【Laravel】ルーティングを甘くみてたら痛い目にあった話

Posted at

web.php のルーティングは甘くみちゃいけない話

練習用で画像投稿機能つきの簡単なウェブアプリを制作しています。
PHP/Laravel学習歴3ヶ月ほどのプログラミング初学者の僕が個人的な備忘録として記述しました。

とりあえず書いておけば良い!と思っていた自分

web.phpにはとりあず必要なものを記述しておけば良いと思っていた。
しかし、エラーが表示されたり、表示されなかったとしても、思い通りに関数が機能してくれないなど問題ばかり発生して、結果的に解決するのに数日を要した。

初めに記述したルーティング(間違い)

---(略)---
Route::group(['middleweare' => 'auth'], function () {
    Route::get('/', 'StoriesController@index');
    Route::post('/stories/create', 'StoriesController@store');
    Route::post('/stories/create', 'StoriesController@upload');
    Route::get('/stories/create', 'StoriesController@upload');
    Route::get('/stories/create', 'StoriesController@add');
    Route::post('/stories/create', 'StoriesController@add');
});
---(略)---

StoriesControlleruploadに写真をアップロードするアクションにした。
しかしうまく機能してくれない。
ただ写真を表示したいページにリダイレクトするだけで写真は投稿できていない。

修正後のルーティング(正しい)

---(略)---
Route::group(['middleweare' => 'auth'], function () {
    Route::get('/', 'StoriesController@index');
    Route::post('/', 'StoriesController@store');
    Route::get('/stories/create', 'StoriesController@add');
    Route::post('/stories/create', 'StoriesController@uplaod');
});
---(略)---

これで、写真を投稿保存、の二つの機能を実装することができた。

何がしたかったのか

ユーザーからのアクセスをStoriesControlleruploadアクションに渡して写真を投稿できるようにしたい。

どんなエラーが起こっていたのか

The POST method is not supported for this route. Supported methods:GET,HEAD.
というエラー文が表示されるか、何も変化せず指定したページにリダイレクトする。

何が問題だったのか

POSTメソッドと/stories/createの組み合わせが複数存在する

最初の間違えている方のコードの3,4,7行目を実際見てみると、

~::post('/stories/create',~

の部分が共通していて、同じ組み合わせが存在していた。

コードは上から書いた順に実行される(当たり前)

間違いの方のコードの最下行のコードをみてみると、最下行のコードが、

Route::post('/stories/create', 'StoriesController@add');

と記述されている。
今回実行したかったStoriesControlleruploadアクションを、このaddアクションが上書きしていた。
それはuploadアクションとaddアクションの~::post('/stories/create',~)が共通していたからである。
コードは上から順に実行される(あたりまえ)。

補足

$php artisan route:list
これを実行することによってどのルーティングが読み込まれているのか確認することができる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0