libro
www.tuyano.com
初心者のためのCakePHP3 プログラミング入門

CRUDの基本について (2/9)

作成:2015-09-19 11:05
更新:2015-09-19 11:05

■addメソッドでフォームをテーブルに保存する

では、コントローラーに用意されるメソッドを作成しましょう。今回は、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の返値をチェックして、エラー時の処理などを行うことができます。今回は、特に処理などは用意してありません。

※プログラムリストが表示されない場合

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 プログラミング入門」に戻る