今まではモデルを使用してきませんでしたが、ここからはモデルを使用します。
コントローラーが司令塔なのに対し、モデルはDBのゴールキーパーです。
DBから値を取得したり、操作したりする仕事はモデルが行います。
ただモデルを作成するだけでは味気ないので、データをチェックする機能(バリデーション)を実装しましょう。
よく会員登録系のサイトで、不適切な名前やパスワードを入力すると、「もう1度やり直してください。」といったエラーメッセージが表示されるかと思います。
これは、運営者が意図したように登録させたいという思惑もあいますが、 DBを守る という意味でも非常に重要です。
モデルはapp/Model/の中に入れます。
CakePHPの命名規則により、今回はtasksテーブルに対するモデルなので、Task.phpになります。(単語を複数形から単数系にします。)
<?php // app/Model/Task.php class Task extends AppModel { public $validate = array( // nameに対するバリデーション 'name' => array( // 基本ルール。最大文字数を60文字に。 'rule' => array('maxLength', 60), // 必須項目か?trueならば必須。 'required' => true, // 空で提出していいか?falseはダメ。 'allowEmpty'=> false, // バリデーションではじかれた場合のメッセージ 'message' => 'タスク名を入力してください' ), // bodyに対するバリデーション 'body' => array( 'rule' => array('maxLength', 255), 'required' => true, 'allowEmpty' => false, 'message' => '詳細を入力してください' ), ); }
tasksテーブルの重要なカラムはnameとbodyなので、この2つを守るようバリデーションを設定します。
バリデーション自体はそこまで難しいことではなく、こう書いておけば保存処理前に勝手にモデルが仕事をしてくれます。
バリデーションについて詳しく調べたい方はこちらを参照してください。
CakePHP公式ドキュメント -データバリデーション-
そういえば、前項にてnameは新規登録できましたが、bodyのロジックを書いておりません。
コントローラーとビューに書き加えましょう。
コントローラーとビューの書き換え
// app/Controller/TasksController.php // 省略 public function create() { // POSTされた場合のみ処理を行う if($this->request->is('post')) { $data = array( // 渡ってきたデータの中からnameという名前のついた値を取り出す 'name' => $this->request->data['name'], // bodyを追加 'body' => $this->request->data['body'] ); // データを登録 $id = $this->Task->save($data); // 保存に失敗したら if($id === false) { // とりあえずビューを表示する $this->render('create'); return; } $msg = sprintf('タスク %s を登録しました。', $this->Task->id); // メッセージを表示してリダイレクト $this->Flash->set($msg); $this->redirect(['controller'=>'tasks','action'=>'index']); return; } // POSTされたデータがなければ普通にcreate.ctpを表示 $this->render('create'); } // 省略
ここで新しくでてきたロジックは下記です。
// 保存に失敗したら if($id === false) { // とりあえずビューを表示する $this->render('create'); return; }
先ほどまでは特にデータのチェック機能がありませんでした。
しかし、今回バリデーションによりモデルが登録を拒否した場合、当然「保存できたレコードのid」は存在しません。
そのため、もし$idを取得できなかったら、言い換えれば、 保存に失敗したら 、元のcreate.ctpを表示します。
それでは次にビューです。
<!-- app/View/Tasks/create.ctp --> <form action="<?php echo $this->Html->url('/Tasks/create'); ?>" method="POST"> <!-- バリデーションのエラーメッセージを表示する --> <?php echo $this->Form->error('Task.name'); ?> <?php echo $this->Form->error('Task.body'); ?> タスク名<input type="text" name="name" size="40"> 詳細<br /> <textarea name="body" cols="40" rows="8"></textarea> <input type="submit" value="タスクを作成"> </form>
バリデーションのエラーメッセージを表示させるため、Formヘルパーのerror()メソッドを使用しています。
これを記述することで、ビューの任意の場所にエラーメッセージを表示することができます。
(Formヘルパーもかなり優秀なヘルパーであり、正直フォーム画面であれば、全てFormヘルパーで作成できます。)
Formヘルパーについて詳しく知りたい方→CakePHP公式ドキュメント -FormHelper-
今回のバリデーションエラーメッセージについて詳しく知りたい方→バリデーションエラーを任意の位置に表示する
ここまでできた方は、試しに何も入力せずに登録してみてください。
下記のようにバリデーションが作用し、登録ページに戻ってきてしまうと思います。