では、コントローラーに用意されるメソッドを作成しましょう。今回は、
PersonsControllerを作成し利用します。「
Controller」フォルダに、「
PersonsController.php」というファイルを作成して下さい。そして、下のリスト欄のように内容を記述しましょう。
これで、
http://localhost:8765/persons/add にアクセスすると、新規作成のフォームが表示されるようになります。そのまま内容を記入し、送信すればそれがレコードに登録されます。(ただし、まだ
indexを作ってないので、送信するとエラーになりますが……)
今回、コントローラークラスに用意してあるのは、「
add」メソッド1つだけです。ここでは、まずPOST送信かどうかをチェックしています。
if ($this->request->is('post')) ……
GETかPOST送信かは、コントローラーの「
request」プロパティにある
Requestインスタンス内の「
is」メソッドで調べることができます。
is('post')がtrueならば、POST送信されたと判断できます。POSTされたなら、送信されたフォームの内容を元にレコードの新規作成をするわけですね。
・エントリーの作成$person = $this->Persons->newEntity();
まず、新しいエンティティを作成します。エンティティは
Personsクラスとして用意してありますが、「
new Persons」というような形でインスタンスを作成するわけではありません。どうするのかというと、$this(コントローラー自身)にある「
Persons」内のメソッドを呼び出して作成します。
CakePHPのコントローラーでは、そのコントローラーに関連付けられているモデルのプロパティが用意されます。ここでは
Personsというモデルを作成していますから、「
Persons」という名前のプロパティが用意されるわけです。
この
Personsプロパティに入っているのは、テーブルクラスのインスタンスです。ここでは
PersonsTableクラスのインスタンスが入っていることになります。その中の「
newEntity」というメソッドを呼び出すことで、エンティティを作成します。
・エンティティに値をマージする$person = $this->Persons->patchEntity($person, $this->request->data);
作成されたエンティティのデータは、値なども設定されていません。いわば「空っぽのエンティティ」なわけですね。これに、送信されたフォームのデータを組み込みます。「
patchEntity」メソッドは、第1引数に指定したエンティティに、第2引数のデータをマージします。
第2引数には、
$this->request->dataという値が指定されていますね。この
Requestにある「
data」というプロパティには、送信されたフォームの値がまとめられた連想配列が保管されています。この値を
dataメソッドの引数に指定することで、そのまま値をエンティティに組み込むことができます。
このように、
patchEntityでフォームの値をエンティティにマージできるのも、フォームを「
フォームヘルパー」で生成したおかげです。手打ちでフォームタグを書いて作成した場合は、こうはいきません。モデルを利用するためのフォームは、フォームヘルパーを利用するのが基本だ、といってよいでしょう。
・エンティティを保存するif ($this->Persons->save($person)) {……
エンティティの保存は、モデル名のプロパティ(ここでは、Persons)にある「
save」メソッドを呼び出します。引数に、作成しておいたエンティティのデータを渡して呼び出せば、データに問題がなければテーブルにレコードとして内容が保存されます。
正常に保存ができると、
saveはtrueを返します。データの保存に失敗するとfalseを返します。ですから、
saveの返値をチェックして、エラー時の処理などを行うことができます。今回は、特に処理などは用意してありません。