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