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

前回CakePHPのインストールから環境設定を行ったので、今回は公式サイトにあるブログチュートリアルhttp://book.cakephp.org/2.0/ja/getting-started.html)を行い、基本を学んでいきたいと思います。

このチュートリアルが日本語対応しているのもCakePHPのいい所ですよね。ありがたい。

 

まず、CakePHPの基本としてMVCという考え方があります。これはModel、View、Contollerの略でこの3つを使ってWEBページを作っていくというものです。

それぞれのファイルはappの中の名前に対応したディレクトリに入れることで作動します。詳しい説明や役割は実際にファイルを作りながら見ていきましょう。

 

まずは、ダウンロードから環境設定が書かれていますがこれは前回やったので飛ばします。一つだけデータベースの作成という内容の所だけ前回やっていないのでやります。

データベースは前回作成済みのもの(僕の場合はcakedb)を使います。ここにテーブルpostsを作っていきます。公式サイトにクエリが書いてあるのでそれをそのまま実行するか直接入力するかの好きな方でいいので中身を作成します。直接入力する場合はテーブル名をpostsにしてカラムを5で作成、中身は以下の通りになります。

f:id:marinok:20150227210210p:plain

次に中身のデータを適当に打ち込んでいきます。何でもいいですが考えるのも面倒なので公式サイトにあるものをそのまま書いてしまいましょう。これも同じく手打ちでもクエリでも好きな方で書いちゃいましょう。

f:id:marinok:20150227211216p:plain

これで準備完了です。

このテーブル名postsというものは適当に決めたものではなく、CakePHPの規約にそったものであり、たくさんの機能を自由に使うことができ、設定作業をする必要がなくなるそうです。詳しくはCakePHPの規約(http://book.cakephp.org/2.0/ja/getting-started/cakephp-conventions.html)にのっています。

 

ここから本格的にプログラムを書いていきます。

最初はPostモデルの作成。
公式サイトの説明によると「モデルクラスは、CakePHPアプリケーションの基本中の基本(bread and butter)です。 CakePHPのモデルを作成することで、データベースとやりとりできるようになり、表示(view)、追加(add)、編集(edit)、削除(delete)といった操作に必要な土台を手に入れることになります。」だそうです。

実際に作りながら理解していきましょう。/app/ModelにPost.phpというファイルを作成します。そして以下のように記述します。

f:id:marinok:20150227212407p:plain

これで完了です。このときの命名規約は大切で、モデルをPostという名前にすることで、CakePHPが自動的にこのモデルはPostsControllerで使用されると考えます。 また、 posts という名前のデータベーステーブルと結びつけられます。

 

次にPostsコントローラの作成。
コントローラは簡単に言うと、幾つかのモデルとやりとりし、投稿記事に関連する作業を行う場所です。 

/app/Controllerに PostsController.php  という名前でファイルを作ります。内容は以下の通り。

f:id:marinok:20150227212426p:plain

この内容の一つ目のアクション(public~)が基本的なコントローラになります。
その下のものが投稿記事一覧が表示されるアクションで、内容はset( )によってコントローラからビューにデータを渡す。find(‘all')メソッドから返ってきた値で、postsというビューの変数を設定しているというものです。

 

以上でモデル、コントローラを作成しましたので、
Postビューを作成していきます。

現在、モデルにはデータが入り、コントローラにはアプリケーションロジックと流れが定義されていますので、作成したindexアクション用のビューを作成します。
ビューはたいていがPHPが含まれるHTMLで記述されます。

Cakeのビューファイルは、 /app/View の中の、コントローラ名に対応するフォルダの中に保存されています(この場合は、「Posts」というフォルダを作成します)。 このPostsフォルダの中にファイル名index.ctpを作成します。この投稿記事データをテーブル表示するには、ビューのコードは以下の通りです。

f:id:marinok:20150227213823p:plain

内容はHTMLでテーブルを作り、その中でfor文で配列内の情報を表示させているだけです。

 

ここまで出来たらとりあえず簡単なMVCの構成は完成したので、

http://localhost:8888/cake/posts/index/にアクセスして見てみましょう。

f:id:marinok:20150227214704p:plain

ちゃんと表示されるはずなのですが、なぜか文字化け。。。

データベース内では文字化けせずに表示されていたのでCakePHPの側に原因がありそう。探してみたらなぜかapp/Config/database.phpのencodingがコメントアウトされていたので解除。

f:id:marinok:20150227214845p:plain

f:id:marinok:20150227215006p:plain

 

次はこのリンクになっているタイトルをクリックしてみます。ここまでうまく行っているならそのアクションはまだ定義されていませんというエラーが表示されるはずです。

f:id:marinok:20150227215515p:plain

 

言われた通りにPostsControllerの中に作ってみましょう。以下のように追加します。

f:id:marinok:20150227221337p:plain

今回は、ひとつの投稿記事の情報しか必要としないのでfind('all') の代わりに、 findById( ) を使います。 

ビューのアクションが、取っているひとつのパラメータは、これから表示する投稿記事のID番号です。 このパラメータは、リクエストされたURLを通して渡されます。 ユーザが、 /posts/view/3 とリクエストすると、「3」という値が $id として渡されます。

 

また、ユーザーが実在するレコードにアクセスすることを保証するために少しだけエラーチェックを行います。 もしユーザが /posts/view とリクエストしたら、 NotFoundException を送出し CakePHPのErrorHandlerに処理が引き継がれます。 また、ユーザーが存在するレコードにアクセスしたことを確認するために同様のチェックを実行します。

 

ではpublic function viewを作ったので実際にview.ctpを/app/View/Postsの中に以下の内容で作っていきます。

f:id:marinok:20150227222445p:plain

内容は単純に渡されたデータを表示するというもの。特筆するならばh( )だが、これはhtmlspecialchars( )をCakePHPでは略すことができる。
これで完了なのでもう一度タイトルをクリックしたり手動で、 /posts/view/1 にアクセスしたりして、動作することを確認しましょう。

f:id:marinok:20150227223510p:plain

 

 

ここまででデータベース内の情報を表示するというシステムは完成です。まだモデルはノータッチに近いですが、とりあえずはMVCを一通り使うことが出来ました。チュートリアルにはまだ続きがあり、記事の追加、編集、削除の機能をつけていきますがとりあえず今回はここまでにしておきます。