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

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

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

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

Q&A

2回答

8804閲覧

Laravelの画像アップロードでCall to a member function store() on nullとなるのを解決したい

Shinji1129

総合スコア3

Laravel

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

0グッド

1クリップ

投稿2019/08/17 22:54

編集2019/08/18 03:26

##Laravelの画像アップロードでCall to a member function store() on nullとなるのを解決したい

Laravelの画像アップロードで煮詰まっております。
storeに値が入りません。書き方が違うのでしょうか?

シンボリックは貼ってあります。

MemberController

1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6 7class MemberController extends Controller 8{ 9 10 public function getIndex(Request $rq) 11 { 12 $keyword = $rq->input('keyword'); 13 $query = \App\Member::query(); 14 15 if(!empty($keyword)) 16 { 17 $query->where('email','like','%'.$keyword.'%')->orWhere('name','like','%'.$keyword.'%'); 18 } 19 20 $members = $query->orderBy('id','desc')->paginate(10); 21 return view('layouts.member.list')->with('members',$members)->with('keyword',$keyword); 22 } 23 24 public function new_index() 25 { 26 return view('layouts.member.new_index'); 27 } 28 29 public function new_confirm(\App\Http\Requests\CheckMemberRequest $request) 30 { 31 $data = $request->all(); 32 return view('layouts.member.new_confirm')->with($data); 33 } 34 35 public function new_finish(Request $request) 36 { 37 $member = new \App\Member; 38 39 $member->name = $request->name; 40 $member->email = $request->email; 41 $member->tel = $request->tel; 42 $member->addr = $request->addr; 43 $member->birth = $request->birth; 44 $member->image = $request->image->store('public/images'); 45 $member->comment = $request->comment; 46 $member->save(); 47 48 return redirect()->to('member/list')->with('flash_message', '登録が完了しました。'); 49 } 50 51 public function edit_index($id) 52 { 53 $member = \App\Member::findOrFail($id); 54 return view('layouts.member.edit_index')->with('member',$member); 55 } 56 57 public function edit_confirm(\App\Http\Requests\CheckMemberRequest $request) 58 { 59 $data = $request->all(); 60 return view('layouts.member.edit_confirm')->with($data); 61 } 62 63 public function edit_finish(Request $request, $id) 64 { 65 $member = \App\Member::findOrFail($id); 66 67 $member->name = $request->name; 68 $member->email = $request->email; 69 $member->tel = $request->tel; 70 $member->addr = $request->addr; 71 $member->birth = $request->birth; 72 $member->image = $request->image->store('public/images'); 73 $member->comment = $request->comment; 74 $member->save(); 75 76 return redirect()->to('member/list')->with('flash_message', '内容が更新されました。'); 77 } 78 79 public function member_delete($id) 80 { 81 $member = \App\Member::find($id); 82 $member->delete(); 83 84 return redirect()->to('member/list')->with('flash_message', '削除が完了しました。'); 85 } 86 87} 88

該当部分

$member->image = $request->image->storeAs('public/images', Auth::user()->id . '.jpg');

追記:

@extends('layouts.layout') @section('content') <header id="">    <h1>Laravel Project</h1> </header> <section id="serch"> <div class="head"><h2>参加者登録</h2></div> </section> <section id="list-table"> <form action="new" method="post" enctype="multipart/form-data"> @csrf @method('PATCH') <table class="list"> <div class="@if($errors->has('name')) has-error @endif"> <tr><th>名前<span>*入力必須</span>@if($errors->has('name'))<span class="text-danger">{{ $errors->first('name') }}</span> @endif</th><td><input type="text" class="form" name="name" value="{{old('name')}}"></td></tr> </div> <div class="@if($errors->has('email')) has-error @endif"> <tr><th>Email<span>*入力必須</span>@if($errors->has('email'))<span class="text-danger">{{ $errors->first('email') }}</span> @endif</th><td><input type="text" class="form" name="email" value="{{old('email')}}"></td></tr> </div> <div class="@if($errors->has('tel')) has-error @endif"> <tr><th>電話番号<span>*ハイフンなし</span>@if($errors->has('tel'))<span class="text-danger">{{ $errors->first('tel') }}</span> @endif</th><td><input type="text" class="form" name="tel" value="{{old('tel')}}"></td></tr> </div> <tr><th>出身(都道府県)</th><td><input type="text" class="form" id="addr" name="addr" value="{{old('addr')}}"></td></tr> <tr><th>誕生日</th><td><input type="text" class="form" name="birth" placeholder="2000/12/12" value="{{old('birth')}}"></td></tr> </table> </section> <section id="picture"> <div class="section-wrap"> <div class="pic-wrap"> <div class="pic-title">画像</div> <div class="pic"> <input type="file" class="form" name="image"> </div> </div> <div class="com-wrap"> <div class="pic-title">メモ</div> <div class="comment"> <textarea type="text" class="" name="comment" placeholder="" value="{{old('comment')}}"></textarea> </div> </div> </div> </section> <section id="back"> <input type="submit" class="btn create-btn" value="登録内容確認"> </form> <a href="{{ action('MemberController@getIndex') }}" class="btn list-btn">一覧へ戻る</a> </section> @endsection

で指定するもnullとなります。

どなたかご教授頂けますと幸いです。

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

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

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

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

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

guest

回答2

0

「storeに値が入らない」というより「リクエストの値がnullなのにstoreを呼び出してるよ」という意味合いのエラーですね。

リクエストからファイル情報を得るのはfile()では?
ファイルストレージ#ファイルアップロード

下記のような過去質問も参考にしてください。

投稿2019/08/17 23:00

編集2019/08/17 23:07
m.ts10806

総合スコア80850

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

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

Shinji1129

2019/08/18 03:25

ご覧いただきありがとうございます。 エラーを誤解しておりました。ダメなわけです。 $member->image = $request->file('image')->store('public/images'); このように書き換えましたが同じくnullでした。 リクエストが出来ていないということはformに誤りがあるのでしょうか? 追記しました。
m.ts10806

2019/08/18 03:51

書き換えたコードも提示されてますか? また、$request->file('image')をddで確認してみてください。
Shinji1129

2019/08/18 13:42

たびたびありがとうございます。 書き換えたコードはこちらです。 $member->image = $request->file('image')->storeAs('public/images'); jpgファイルでvar_dump($_FILES);したところ array(1) { ["image"]=&gt; array(5) { ["name"]=&gt; string(36) "greg-rakozy-vw3Ahg4x1tY-unsplash.jpg" ["type"]=&gt; string(10) "image/jpeg" ["tmp_name"]=&gt; string(14) "/tmp/phpcLs92P" ["error"]=&gt; int(0) ["size"]=&gt; int(30998) } } となりました。 一時保存の場所が悪いように思うのですが... Debugbarをみると配列にimageが格納されていない状態です。 github:: https://github.com/Shinji1129/DockerLaravel/commit/febecb1a92feabfdf787d9731db3d89d75ed1db8
m.ts10806

2019/08/18 13:46

Laravel使っていて$_FILESは意味ないです。 私は$request->file('image')をddで とお願いしたのですが、どうしてスルーされるのでしょうか? Laravelでは$_FILESや$_POSTを直接参照することもvar_dump()を利用することもないですよ。 ちゃんと用意されている機能を使ってください。
Shinji1129

2019/08/18 21:06

知識不足で失礼します。 回答ありがとうございます。 ヘルパを知りませんでしたので改めました。 $request->file('image')をddで確認したところstore() on nullページに遷移します。他の値では正常に確認できます。 また、$data = $request->all();を確認すると "image" => UploadedFile {#345 ▼ -test: false -originalName: "greg-rakozy-vw3Ahg4x1tY-unsplash.jpg" -mimeType: "image/jpeg" -error: 0 #hashName: null path: "/tmp" filename: "php9XML2J" basename: "php9XML2J" pathname: "/tmp/php9XML2J" extension: "" realPath: "/tmp/php9XML2J" aTime: 2019-08-19 05:54:37 mTime: 2019-08-19 05:54:37 cTime: 2019-08-19 05:54:37 inode: 3425981 size: 30998 perms: 0100600 owner: 1000 group: 33 type: "file" writable: true readable: true executable: false file: true dir: false link: false } とでました。
m.ts10806

2019/08/18 21:11 編集

>$request->file('image')をddで確認したところstore() on nullページに遷移します。 ddはその場で処理を止めるのでstore()使った後に入れたのであればそれはそうなるでしょうね。 エラーとなるとExceptionを拾うのでそのdd自体実行されないです。
Shinji1129

2019/08/19 22:27

回答ありがとうございます。 基礎的な知識の抜けが多く解決に至りませんので、 一度画像ファイルアップロード機能だけのプログラムを組んでみることにしました。
m.ts10806

2019/08/19 23:13

むしろファイルアップロードを抜いてみては?
Shinji1129

2019/08/20 01:48

ご提案ありがとうございます。 そうですね! それも考えましたが どの道、今後の学習の為にもファイルアップロード機能は外せません。 一度動くプログラムを組んで、それから照らし合わせ、組み込めれば組み込むことにします。
m.ts10806

2019/08/20 01:50

問題切り分けのためには両方試したほうが良さそうですね。 むしろ$request自体をddしてみて中身を確認するところからかなと
phper.k

2020/10/26 14:50

confirm ページ挟んでるからだよ…
guest

0

Call to a member function store() on nullということであれば、間違いなく値が空(null)で送られてきているのだと思います。

ルーティングの記載がないので、データの受け渡しがどういう流れなのかわかりませんが、見る限り
new_index -> new_confirm -> new_finish
edit_index -> edit_confirm -> edit_finish
の2つの流れがあるようにお見受けします。

気になったのですが、new_confirmとedit_confirmですが、両方とも$data = $request->all();でリクエストの値を全て取得し、ビューに送っているようですが、その後の値はどう処理しているのでしょうか?

掲載しているビューはindexで使用するビューではないかと思うのですが、POST送信後、フォームリクエストでのバリデーション通過後のlayouts.member.new_confirmとlayouts.member.edit_confirmでは取得した値をどう処理してnew_finishに再度POSTしているのでしょうか?
多分確認画面を使用し、内容の確認を行っていると思うのですが、その際$dataの値をきちんと使用できていますでしょうか?

できればルーティングと他のビューの内容も見たいですね。

投稿2020/10/26 12:16

Charry

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問