CakePHPを学ぶ:ブログチュートリアル後編

前回、データベースを読み込み、記事を表示できるようにしました。
今回はその続きから、記事の追加、編集、削除を実装していきます。

 

・記事の追加

まずはコントローラにadd( )アクションを追加します。

f:id:marinok:20150304185358p:plain

add( )アクションの内容は、もしこのリクエストがPOSTならPostモデルを使ってデータを保存する。保存されたらそれを伝えるメッセージを表示し、一覧ページにリダイレクトする。そうでなければ、警告メッセージを表示するというもの。

すべてのCakePHPのリクエストは CakeRequest オブジェクトに格納されており、$this->request でアクセスできます。リクエストオブジェクトには、受信したリクエストに関するいろんな情報が含まれているので、アプリケーションのフローの制御に利用できるようです。今回は、最初のif分でリクエストがHTTP POSTかどうかの確認にCakeRequest::is( ) メソッドを使用しています。

SessionComponentの SessionComponent::setFlash( ) メソッドを使ってセッション変数にメッセージをセットすることによって、リダイレクト後のページでこれを表示します。 レイアウトでは SessionHelper::flash を用いて、メッセージを表示し、対応するセッション変数を削除します。
コントローラの Controller::redirect 関数は別のURLにリダイレクトを行います。 array('action' => 'index') パラメータはpostsコントローラのindexアクションを表すURLに解釈されます。

save( ) メソッドを呼ぶと、バリデーションエラーがチェックされ、もしエラーがある場合には保存動作を中止します。 これらのエラーがどのように扱われるのを実行しながら見ていきます。

 

・データのバリデーション
Cakeはフォームの入力バリデーションの作業を簡単、高速にすることができます。
バリデーションの機能を活用するためには、ビューの中でCakeのFormHelperを使う必要があります。 FormHelperはデフォルトで、すべてのビューの中で $this->Form としてアクセスできるようになっています。

これを用いてaddのビューをapp/View/Postsのなかに「add.ctp」として以下のように書きます。

f:id:marinok:20150304185846p:plain

ここで、FormHelperを使って、HTMLフォームの開始タグを生成しています。
$this->Form->create( ) が生成したHTMLは,
<form id="PostAddForm" method="post" action="/posts/add”>
となります。

$this->Form->input( ) メソッドは、同名のフォーム要素を作成するのに使われています。 最初のパラメータは、どのフィールドに対応しているのかをCakePHPに教えます。 2番目のパラメータは、様々なオプションの配列を指定することができます。
$this->Form->end( ) の呼び出しで、submitボタンとフォームの終了部分が出力されます。 end() の最初のパラメータとして文字列を指定すれば、それに合わせてsubmitボタンに名前がつき、終了フォームタグも出力します。ヘルパーの詳細に関しては、 ヘルパー を参照してくださいとのこと。


add.ctpというビューを作ったので一覧ページからとべるようにしていきます。
/app/View/Posts/index.ctp のビューで「Add Post」というリンクを新しく表示するように編集しましょう。 <table> の前に、新しく記述します。

f:id:marinok:20150304185920p:plain

バリデーション要件をCakePHPに指示するには、モデルの中で定義します。 Postモデル(/app/Model/Post.php)を修正します。

f:id:marinok:20150304185944p:plain

ここでは、本文とタイトルのフィールドが、空ではいけない、ということを設定しています。 CakePHPのバリデーションエンジンは強力で、組み込みのルールがいろいろあります (クレジットカード番号、Emailアドレスなど)。 この設定に関する詳細は、 データバリデーション を参照してくださいとのこと。

 

以上で記事の追加の機能は終了です。
確認のためhttp://localhost:8888/cake/posts/indexにアクセスし、AddPostのリンクが出来ているかを確認します。

f:id:marinok:20150304190023p:plain

さらにリンク先に飛び、記事が追加できること、タイトルや本文が空だとエラーが出ることを確認してみます。

f:id:marinok:20150304190117p:plain

f:id:marinok:20150304190142p:plain



・投稿記事の編集

つぎに投稿記事の編集が出来るようにしていきます。公式サイトではもうCakePHPプロのあなたは〜とジョークのような煽りのような言い方をされ始めます。
正直ここでプロになれてたらビビります(笑)

まぁプロでなくてもパターンとしてアクションをつくりビューを作るという流れは理解できてきました。
早速編集機能のアクション、edit( )アクションをコントローラに以下のように追加していきます。

f:id:marinok:20150304190216p:plain

内容はまず、編集する対象が実在するかidで確認します。このときに$id パラメータが渡されてないか、ポストが存在しない場合、 NotFoundException を送出してCakePHPのErrorHandlerに処理を委ねます。次に、リクエストがPOSTかPUTであるかをチェックします。 もしリクエストがPOSTかPUTなら、POSTデータでレコードを更新したり、バリデーションエラーを表示したりします。もし $this->request->data が空っぽだったら、取得していたポストレコードをそのままセットするというもの。

つぎにeditビューを作ります。/app/View/Posts/にedit.ctpをつくり、以下のようにします。

f:id:marinok:20150304190253p:plain

記事の追加のときとほぼ同じ内容ですね(当たり前ですが)。
では、こちらも同じようにindexにリンクをつけましょう。
/app/View/Posts/index.ctp のビューを以下のように修正します。

f:id:marinok:20150304190321p:plain

以上で記事の編集機能は終了です。
確認のためhttp://localhost:8888/cake/posts/indexにアクセスし、Editのリンクが出来ているかを確認します。

f:id:marinok:20150304190346p:plain

リンク先にとび、記事の内容を編集してSave Postを押し、タイトル、内容が変更されているか確認します。

f:id:marinok:20150304190420p:plain

 

 

・投稿記事の削除
投稿記事を削除する機能を作ります。コントローラにdelete( )アクションを以下のように作ります。

f:id:marinok:20150304190451p:plain

内容は単純に$idで指定された記事を削除するというもの。その際に$this->Session->setFlash( )を使ってメッセージを表示し、/postsにリダイレクトする。GETリクエストを使って削除しようとすると例外処理がされます。捕捉されない例外はCakePHPの例外ハンドラーによって捕まえられ、一番適切なエラーページが表示されるそうです。

今回は削除を実行してリダイレクトするだけなのでビューはいりませんので、indexビューにリンクを張るよう修正していきます。

f:id:marinok:20150304190525p:plain

postLink( ) を使うと、投稿記事の削除を行うPOSTリクエストをするためのJavascriptを使うリンクが生成されます。 GETリクエストを使って削除を許可するとWEBクローラーが不意にコンテンツ全てを削除できてしまうので気をつけてください。

確認のためhttp://localhost:8888/cake/posts/indexにアクセスし、Deleteのリンクが出来ているかを確認します。
そのままクリックし、記事を削除できるか確認します。

f:id:marinok:20150304190617p:plain

f:id:marinok:20150304190604p:plain

 

 

・ルーティング

直下にアクセス(http://localhost:8888/cake/)したときに、どのコントローラのどのアクションを実行するかを手動で設定します。
今のところ、ユーザがサイトを見に来ると、 CakeはPagesControllerに接続し、「home」というビューを表示するようになっています。これをPostsControllerに行くようにしてみましょう。
Cakeのルーティングは、 /app/Config/routes.php の中にあります。
この中の設定を以下のように修正します。

f:id:marinok:20150304190743p:plain

 

以上でCakePHPチュートリアルは終了ですね。
これをやってみてCakePHPを理解できるかというと微妙ですね。。。

とりあえず、流れだけ掴めれば良いかと思います。
さらに理解を深めるようにするには、ガンガン使って覚えていくしかないですかね。

CakePHPの利点であるマニュアルが日本語対応しているということもあるので色々やって行きたいと思います。