ようやくフォームやテンプレートのあたりに入ってきました。そこで、「BEAR.Sundayでコンタクトフォームを作ってみる」を真似て Aura/Input/Form を使ってフォームを表示してみようとしました。
これが例によってまた大ハマリ。リソースの onGet()
でちょっと特殊なことをやっていたせいなのですが。
Aura.Input をインターセプトするために、BEAR.Package には AuraFormTrait という便利な Trait が用意されていて、これを使うと Aura.Input 用の invoke()
を書かなくて済みます。
AuraFormTrait::invoke()
のおおまかな処理を説明しますと、
- GET の場合は、入力フォームを表示するため
onGet()
を呼びます。 - POST の場合はバリデーションを行い(
$this->form->filter()
)、通れば元の ResourceObject の onPut/onPost/onDelete などの処理を続行します($invocation->proceed()
)。DBなどに保存する処理が続くでしょう。 - バリデーションを通らなければ、エラーメッセージをセットして、
onGet()
を呼びます。もう一回見直して入力しろ、と入力フォームを表示するわけですね。
んで何が問題だったかというと、invoke()
内で onGet()
を呼ぶときに、引数なしで呼ぶので、期待していた ResourceObject::onGet()
の引数が null になってしまいました。
フォームを表示するときに引数を渡すこともそんなに無いかもしれませんが、例えば「カテゴリ:動物」内に記事を作る、ってときに category_id=3
なんてのを渡したり、ページAの子ページを作るときに、parent_id=56
なんてのを渡したりすることがありますが、こういったパラメタが渡せなくなってしまいます。
あれ、でもこれ、今まで POST(新規投稿)で考えていたけど、更新や削除の時に渡す Primary Key な $id も無くなっちゃう? 何か作り方を間違えているような気もしますね ^ ^;; そのような場合は AuraFormTrait を使わずに自前で処理を書くべきなのかな。