質問: よろしくお願いいたします。 `[PC]: MacOS 10.15.4` 現在はpaizaを参考にLaravelテストを行なっておりますが、ご質問させてください。 `Laravel`にて、formタグをlaravelファサードで使用する際に、`Form::model`と`Form::open`という形式で記述しますが、いまいち違いがわかりません。 特に、`Form::model`に関して理解できておりません。 例として以下に2つほど事例を記載します。 Form::modelでの記述例 ``` {{ Form::model($company, ['route'=> ['company.update',$company->id]]) }} {{ Form::label('name','会社名:') }} {{ Form::text('name',null) }} {{ Form::label('address','住所:') }} {{ Form::text('address',null) }} {{ Form::label('category_id','カテゴリ:') }} {{ Form::select('category_id',$categories) }} {{ Form::submit('更新',['class' => 'btn btn-outline-primary']) }} {{ Form::close() }} ``` Form::openでの記述例 ``` {{ Form::open(['method'=>'delete','route'=>['company.destroy',$company->id]]) }} {{ Form::submit('削除',['class'=>'btn btn-outline-danger']) }} {{ Form::close() }} ``` ※二つの性質の違いが質問内容ですので、ルーティングやコントローラーの全文記述はしておりません。 `$company`変数には`open,model`どちらのパターンも`Company::find($id);`にて作成したDBにおける`id`に伴った`Companyテーブル`1行分のデータを格納しております。 二つの違いはメソッドにて定義した変数があるかないかだけですが、 `Form::open`に関しては`html`の`formタグ`での`method`と`action`が記述され、`$comapany`の`id`がルーティングを通して次のメソッドへ渡されているだけなので、理解しやすいのですが、 `Form::model`の場合は第一引数に`$company`が入っています。これが何のために記述されているのか不明です。やっていることは`Form::open`での場合と同じくルーティングを通してテーブル各行のデータに伴うidを渡しているだけなのですが.... デベロッパーで確認すると`Form::model`は以下 ``` ``` でしたので、とりわけ変わったところがなかったのですが.... 唯一記述に違いがあるとしたら`method`を指定していない点くらいですが、同じように新規作成ページにおいて使用した`Form::open`では`method`指定なく`method=post`になっていたので、特に無関係そうなのですがどういった違いがあるのか理解できておりません。 Laravelを使用している方など、`Form::model`と`Form::open`の違いご存知の方がいらっしゃいましたらご教授いただけますと幸いです。 ※ファサードに引数入力されているルーティング`(Route::getの末尾"->name('xxxx(任意名)')")`を使用しておりますが、不必要だと考え、`company.update`と`company.destroy`のメソッド詳細は割愛しております。
回答: Form自体あまり使っていないので、うろ覚えですが、モデルのデータ更新に特化しているというイメージです。 例えば、 テキスト入力フォーム要素を生成すると、フィールド名と一致するモデルの値が自動的にフィールド値として入ってくれます。 例えば、Userモデルと関係するフォームを作成した場合、 ``` {!!Form::text("name",null)!!} ``` Form::modelの場合、このように書くだけで、既存のユーザーデータがあれば、 自動的にvalueに値を入れてくれます。 valueの優先順位的には、以下のようになるらしいので、気をつけてください。 1. セッションフラッシュデータ(古い入力) 2. 明示的に渡された値 3. モデル属性データ(これが今回自動的に入れてくれると述べたデータ) コードをみると、modelと関連づけている点以外は、Form::openと同じ処理です。 ``` public function model($model, array $options = []) { $this->model = $model; return $this->open($options); } ``` 07/03 追記 「同じ処理です」という表現は少し違うと思い直し、追記します。 Form::openの処理とForm::modelの処理を追うと、本当に $this->model = model; の処理があるか、ないかの違いしかありません。 ではどこで違いが出るかというと、 text, checkboxなどのinput, textareaなどのフォームの要素を追加するメソッドを利用した場合に $this->modelに値が入っているか、いないかで処理が異なってくる部分がでてきます。 (Formクラスがシングルトンパターンを利用してインスタンスを生成しているため) そして最後にForm::closeを実行することで、$this->modelにnull(おそらくnullだったはず)を代入しています。