#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');
});
---(略)---
StoriesController
のupload
に写真をアップロードするアクションにした。
しかしうまく機能してくれない。
ただ写真を表示したいページにリダイレクトするだけで写真は投稿できていない。
###修正後のルーティング(正しい)
---(略)---
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');
});
---(略)---
これで、写真を投稿、保存、の二つの機能を実装することができた。
##何がしたかったのか
ユーザーからのアクセスをStoriesController
のupload
アクションに渡して写真を投稿できるようにしたい。
##どんなエラーが起こっていたのか
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');
と記述されている。
今回実行したかったStoriesController
のupload
アクションを、このadd
アクションが上書きしていた。
それはupload
アクションとadd
アクションの~::post('/stories/create',~)
が共通していたからである。
コードは上から順に実行される(あたりまえ)。
###補足
$php artisan route:list
これを実行することによってどのルーティングが読み込まれているのか確認することができる。