CakePHPで高速Webアプリ開発

第6回 CakePHPで作るToDoアプリ(2)

この記事を読むのに必要な時間:およそ 3.5 分

モデルへの値が渡されてきているかチェック

    if (!empty($this->data)) {

$this->dataにはモデルへの値が連想配列で格納されています。HTMLヘルパーのinputメソッドで記述されたinput要素の値などがそれにあたります。URLを入力しただけでデータが追加されないように,$this->dataに値が格納されている場合のみ追加処理を行うため,このようにして簡易に判定しています。

モデルへのデータの追加とフィールドのホワイトリスト

  if ($this->Task->save($this->data, true, array('content', 'created', 'modified'))) {

モデルのsaveメソッドは,DBへのレコードの追加や変更を行うメソッドです。第一引数には値を連想配列で指定します。$this->dataにはsaveメソッドに合う形で値が格納されているため,そのままsaveメソッドに渡すことができます。

第二引数はモデルのバリデーション機能を使用するかどうかのフラグです。必須ではなく,デフォルトはtrueです。まだバリデーション機能は実装していませんが,後々実装するのでここではtrueにしておきます。

第三引数は,第一引数に渡された値から使用するカラムを限定するために使用します。WebアプリケーションへのHTTPリスエストは誰でも自由に構築できるため,悪意をもったユーザによって設定された値で予期しない動作を引き起こされてしまう可能性があります。この引数を利用すると,予期しないカラムへの値のセットを避けることができます。この値は必須ではなく,デフォルト値はarray()でまったく限定されません。

ここではToDoの内容を格納するcontentカラムと,CakePHPが自動で設定する created(作成日時)および modified(更新日時)カラムを指定しています。

createdおよびmodifiedは常に指定しておくとよいでしょう。ちなみに$this->dataにcreatedとmodifiedが存在しても無視されるので,作成日時や更新日時を詐称されることはありません。

簡易な完了メッセージ表示

    $this->flash('タスクが追加されました', '/tasks');
    return;

コントローラのflashメソッドを使うと,簡易なリンクつきメッセージが表示できます。ここではsaveメソッドが成功したら完了を知らせるメッセージとToDo一覧へのリンクを表示しています。

$this->dataに値がないか,saveに失敗したときはリダイレクト

    $this->redirect('/tasks');

予期しないリクエストや問題が起きた際はToDo一覧ページへリダイレクトしています。これを最後に書いておかないとaddアクションに対応するビューを表示しようとして,ビューが存在しないエラーが発生してしまいます。

タスクを追加してみよう

tasksコントローラの書き換えが完了したら,実際にタスクを追加してみましょう。正常にタスクが追加できれば今回の作業は終了です図2~4⁠。

図2 タスク内容を入力して,タスクに追加ボタンを押す

図2 タスク内容を入力して,タスクに追加ボタンを押す

図3 完了メッセージが表示されるので,メッセージ上のリンクを辿る

図3 完了メッセージが表示されるので,メッセージ上のリンクを辿る

図4 タスクが追加された

図4 タスクが追加された

次回予定はタスクの状態変更の開発です。

著者プロフィール

秋田真宏(あきたまさひろ)

株式会社ロケットスタート エンジニア。個人ブログは「akiyan.com」。1981年生まれ。

URLhttp://www.akiyan.com/

著書