@RikuMoto (Riku Moto)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Laravelでエラー GETメソッドはサポートされていない、サポートされているメソッド:POST

Q&A

Closed

解決したいこと

Laravelで画像投稿できるようになりたい。

Routeで怒られているので解決したいです。どなたか教えてください。
このようなエラーが出ます。

スクリーンショット 2021-09-27 19.38.47.png

web.php
    Route::group(['prefix'=>'tomoviews'],function(){
    Route::get('photo', 'PhotoFormController@photo')->name('views.photo');
    Route::post('newpost', 'PhotoFormController@store')->name('views.newpost');

});
PhotoFormController.php
    public function store(Request $request){

        $imgPath = $this->saveImage($request->file('eimg'));

        $diary = new Photo();
        $diary->eimg = $imgPath;

        $diary->save();
        return redirect()->route('tomoviews.photo');
    }
    private function saveImage($image)
    {
       $imgPath = $image->store('Picture', 'public');

       return 'storage/' . $imgPath;
    }
    public function photo ()
    {
        $diaries = Diary::all();
        return view('photo', ['diaries' => $diaries]);
    }
newpost.blade.php
<form method="post" action="{{ route('store') }}" enctype="multipart/form-data">
@csrf
  <div class="li-content">
     <label>新規画像</label>
     <div class="basic">
     <input type="file" name="eimg" id="eimg" placeholder="画像選択"></div>
  </div>
</form>
photo.blade.php
    @foreach ($diaries as $diary)
            <div class="estate-img1">
                <img src="{{ asset($Photo->eimg) }}">
            </div>
    @endforeach

http://127.0.0.1:8000/tomoviews/newpost
開いて画像を投稿してtomoviews/photoに表示させたいです。

宜しくお願いします...

レビュー修正

web.php
Route::group(['prefix'=>'tomoviews'],function(){
    Route::get('photo', 'PhotoFormController@photo')->name('views.photo');
    Route::match(['get','post'],'newpost', 'PhotoFormController@store')->name('views.newpost');

このように記述すると別のエラーが出ました。
スクリーンショット 2021-09-27 21.33.36.png

PhotoFormController.php
    public function store(Request $request){

        $imgPath = $this->saveImage($request->file('eimg'));

        $diary = new Photo();
        $diary->eimg = $imgPath;

        $diary->save();
        return redirect()->route('tomoviews.photo');
    }
    private function saveImage($image)
    {
       $imgPath = $image->store('Picture', 'public');

       return 'storage/' . $imgPath;
    }
    public function photo ()
    {
        $diaries = Diary::all();
        return view('photo', ['diaries' => $diaries]);
    }
$imgPath = $image->store('Picture', 'public');

ここで怒られているのですが...

投稿もしていないのでNULLは当たり前なのに、こんな怒られ方がわかりません。
た、助けてください...

0 likes

3Answer

やりたいことをまとめると、

  1. 画像を投稿するフォームを表示する処理 (?)
  2. 投稿された画像を保存する処理 (POST /tomoviews/newpost)
  3. 保存された画像を表示する処理 (GET /tomoviews/photo)

の3つあるのですが、1のrouteがありません。

リンクや、アドレスバーに直接URLを入力するとGETでのリクエストになるので、
/tomoviews/newpostにそれでアクセスすると、問題のエラーになると思います。
(POSTしか許可していないので)

解決策は/tomoviews/newpostに2つのmethodを割り当てるか、別のrouteを設定します。

2つ以上のmethodを割り当てる例
Route::match(['get', 'post'], '/', function () {
    //
});

1Like

Comments

  1. @RikuMoto

    Questioner

    前回に引き続き回答ありがとうございます😭😭

    blue32aさんの回答をもとにレビュー修正したのですが、違うエラーが起こっていまいました。
    編集したのでどうかお願い致します。
PhotoFormController.php
    public function store(Request $request){
        $imgPath = $this->saveImage($request->file('eimg'));
    }
    private function saveImage($image)
    {
       $imgPath = $image->store('Picture', 'public');
    }

おそらく$request->file('eimg')がnullになっているのでしょう。

saveImage()の引数$imageの中身がnullになるので、
null->store('Picture', 'public')なり、
そのエラーが出ているのだと思います。

私が回答したのはあくまでエラーの解決方法で、やりたいことを実現するにはもう少しかかると思います。

まだPHPやLaravelの基本に対する理解が十分ではないようですので、
まずはCRUDの基本的な作り方を勉強されたほうが良いと思いますよ。
CRUDとは生成(Create)、読み込み(Read)、更新(Update) 、削除(Delete)です。

1Like

Comments

  1. @RikuMoto

    Questioner

    回答ありがとうございます。

    一応、Udemyで一通り学習して、画像以外(Text)の投稿はできるようになったので、CRUDの基礎くらいは理解できたつもりでした。画像投稿はUdemyで学習した範囲外でしたので、Qiitaで掲載していたコードを使い実装したかったのですが、このような感じになっています。

    違うQiitaの投稿を見て学習したいと思います。
    ありがとうございました。
  2. 一度に全ては理解できないですし、ちょっと違うことやってみてはつまづいて...の繰り返しで覚えていくものなので、そういうものだと思います。
    頑張ってください。

    ちなみにLaravelのようなフレームワークを使うと、基本的なことを全部やってくれるので簡単に作れる反面、その基本的なことを学べなかったりします。
    学習の目的にもよりますが、フレームワークなどを一切使わずに作ってみるのもおすすめです。

もう解決済ならスルーしてください。
ちなみに$request->file('eimg');
をvar_dumpとかdd()とかで何が表示されているか確認されましたか?
もしnullならviewのformがおかしいとかわかるかと思うのですが、どうでしょう?
あと、見た感じviewのformの中にsubmit系の要素がないように見えますが、jsでsubmitしているとかでしょうか?

1Like

Comments

  1. @RikuMoto

    Questioner

    回答ありがとうございます。

    こちらQiitaの記事にあるものをコピペして実装したのですが、
    いろいろ調べてみるとおかしい点が複数あることに気づいたのでクローズしたいと思います。

    わざわざ回答くださりありがとうございます。
  2. 解決してないのであればお力になれるかと思いましたが、クローズするのであればオッケーです
    お互い頑張りましょう!
  3. @RikuMoto

    Questioner

    な、なんて励ましのお言葉...素直に嬉しいです!
    がんばります!!

Your answer might help someone💌