コスタ)で行われた「8時間耐久CakePHP2勉強会@福岡」の勉強会の内容を元に書かれています。この記事は2年以上前に書かれたものです。情報が古い可能性があります。CakePHPって?CakePHP(けいくぴーえいちぴー)はPHPで作られているMVCフレームワークです。フレームワークはシステムの基盤みたいなもので、通常システムで自分で実装しなければならない部分が最初からたくさん詰まってます。ライブラリやクラスの集まりとでもいうんでしょうか。Controllerの略でMVC定義はフレームワークによって若干意味合いが違うのですが、Modelはデータ制御、Viewは表示制御、ModelとViewを制御する司令塔がControllerみたいな感じです。実際にインストールを行なってみましょう。事前にXAMPPなりMAMPなりで以下が動作する環境を整えてください。)pdo_mysqlmod_rewrite勿論MySQL以外のデータベースで動作させることも可能ですが、今回はMySQL前提に進めていきます。PHP5.2.6はPDOのバグがあって、PHP5.2.7はセキュリティの脆弱性の問題で配布停止になっているのでCake2.0.6からPHP5.2.8以上が推奨されるようになりました。exceptionCakePHPのページから安定版の2.0.6をダウンロードします。PHPが動作するドキュメントルート(htdocsフォルダ)等にダウンロードしたファイルを解凍します。今回は「cake」とリネームするとします。「cake」フォルダの中身です。ちなみに「/lib/Cake」内のCakePHPのコアのファイルは触らないでください。「http://localhost/cake/」にアクセスしてみましょう。MAMPの方は「http://localhost:8888/cake/」かも知れませんが、以降説明時は「http://localhost/cake/」で統一します。rewriting」とエラーが表示されていないでしょうか。このエラーはApache(Webサーバで)mod_rewriteというURL書き換えを行うモジュールが有効になっていない場合に出ます。そこでApacheの設定ファイルを編集しましょう。xamppの場合インストールディレクトリ配下の「apache/conf/httpd.conf」ファイルを編集します。modules/mod_rewrite.so編集し終えたらApacheの再起動を行います。スタイルシートが適用された状態です。mod_rewriteが有効になりました。mod_rewriteを使わない場合は?「/app/Config/core.php」を編集します。env(‘SCRIPT_NAME’));」の部分の「//」を外してコメントアウトを解除して保存した後、以下の.htacessファイルを削除します。writable.」と警告が出る場合は、読み書き可能にしておきましょう。Security.saltとSecurity.cipherSeed「/app/Config/core.php」の「Security.salt」と「Security.cipherSeed」の値を適当なものに変更します。これはセキュリティ上変えておく必要があります。APP/Config/database.php」と警告が出ていますので、「/app/Config」の「database.php.default」というファイルを同ディレクトリにコピーして「database.php」というファイルを作成します。「database.php」をご自身の環境に合わせて設定してください。今回「cake」というデータベースを「utf8-general-ci」で作成しました。NAMES」が使用されてるみたいですね。NAMES」を投げるのは危険性があるようなので以下参考までに。前置きが長くなりましたが「http://localhost/cake/」にアクセスしてエラーや警告が出なくなればOKです。2.0.xのマニュアルが以下に掲載されています。日本語版はまだ不完全なようなので足りない部分は英語版を参照してください。マニュアル(英語)またAPIもこちらからご覧になれますので、CakePHPで用意されてるクラスで何をしてるのか、どういったものがあるのか調べるのに便利です。Controllerでは実際にControllerを書いてみましょう。記述は勿論PHPです。ModelやらViewやらはまだ使いません。ControllerのPHPファイルは「/app/Controller/」内に作成します。ControllerはCakePHPのコアで用意されている「AppController」というクラスを継承します。{}という風に書きます。ファイル名(.phpを抜かした部分)とクラス名は同名になります。「HelloController」というクラスを作成した場合、ファイル名は「HelloController.php」になります(※CakePHP2系からアンダーバー「_」などは使わずファイル名やフォルダ名には大文字を使用するようになりました)。MVCフレームワークは大体こういった命名規則に乗っ取って繋がってることが多いのでここ注意が必要です。World!」と表示するだけのシンプルなコントローラ「/app/Controller/HelloController.php」を作成します。false;と書いて、Viewファイルの読み込みと、自動レンタリングを無効にします。false;などと書いていたかも知れませんが、これはPHP4と互換性を保つための記述なので、PHP5を前提としているCakePHP2系ではvarと書く必要はないでしょう。(varはPHP5だとpublicメンバとみなされるのでCakePHP2系ではpublicと記述します。}}「http://localhost/cake/hello/」にアクセスします。「hello」というパスを叩くのかというと「HelloController」の「Controller」を抜かして小文字にした部分となります。World!」と出力されます。「http://localhost/cake/hello/other/」にアクセスします。Other!otherアクションが呼ばれて「Other!」と出力されます。「http://localhost/cake/hello_world/」と「http://localhost/cake/helloworld/」という両方のURLでアクセス出来ました。命名規則に従ったViewを呼び出すここからViewも作成していきます。/app/Controller/HelloController.php・・・ファイル/app/View/Hello・・・ディレクトリ/app/View/Hello/index.ctp・・・ファイル上記三つを作成しましょう。「http://localhost/cake/hello/」indexアクションを用意しておくと上記のURLにアクセスした時には「/app/View/Hello/index.ctp」というViewファイルが読み込まれます。呼び出すViewを指定する/app/View/Hello/other.ctpを追加します。読み込むViewをindexアクションで指定しているので上記のURLにアクセスした時には「/app/View/Hello/other.ctp」というViewファイルが読み込まれます。自動レンタリングを無効にするHelloController.phpControllerでは$autoLayoutというプロパティが「true」(有効)になっており、標準だと「/lib/Cake/View/Layouts」内にある「default.ctp」というレイアウトファイルで自動的にレンタリングされます。false;と記述します。Viewに値を渡すViewに値を渡すには$this->set()メソッドを使用します。variable〜」とNoticeエラーが発生します。変数がセットされてるかはisset()関数でチェックできるんですが、Cake的にそういうものが用意されてるかもしれませんねー。$this->fetch('message');とかいう風に取得できそうですね。ソース眺めてたらViewBlockクラスのgetメソッドに飛んでissetとかやってくれてるような感じだったので2.1からはfetch使った方がよさげですね。別アクションやURLにリダイレクトさせる以下は「http://localhost/hello/」にアクセスした際に、別アクションやURLにリダイレクトさせる例です。formの値を取得するフォームから入力された値をControllerで取得します。アプリケーションらしくなってきましたね。例のごとく「/app/Controller/HelloController.php」、「/app/View/Hello/index.ctp」、「/app/View/Hello/other.ctp」を作成します。「index.ctp」が入力フォーム用のView、「other.ctp」が結果表示用のViewです。(※例ではControllerからViewにsetメソッドでリクエストパラメータを受け渡していますが、こんなことしなくてもView自身で取得することも可能です。$this->Session->setFlash()$this->Session->setFlash()は登録完了時など一時的にメッセージを表示したい際などに使用できます。「http://localhost/cake/hello/」$this->Session->setFlash()でセットしたメッセージを表示する記述をViewに書いてないのに表示されるのは自動レンタリングが関係しています。?>という記述があるのが分かります。使用するModelを指定する方法です。例は、配列で複数のModelの名前を指定しています。省略時はControllerと同名になるようです(例の場合だとHello)。$scaffold;」と宣言するだけで標準の機能であるScaffoldingを利用することができます。DBのテーブルとModelを作成することで対象のデータ一覧表示、データの追加・更新・削除などの機能を実装してくれます。Modelさて、ここからModelです。ModelはDBのデータを扱うのでDBにテーブルを作成しなければなりません。最初に作成したデータベース「cake」にテーブルを3つ作るとします。以下のテスト用SQLをphpMyAdminで流してください。「created」や「modified」というフィールドを作っておくと、saveメソッドで更新や追加をした際に自動で更新してくれるようです。'こんにちは!これはテスト投稿です。'CakePHPを始めてみましょう。これはテスト投稿です。データを全件取得するここから駆け足で説明していくので、今回作成するファイルは下記のもの程度にします。/app/Model/Comments.php/app/Model/Posts.php/app/Model/Terms.phpがModelのクラスファイルです。Posts.php先ずはPosts.phpを作成してみましょう。使用テーブル名と主キーの設定を行なっています。'id';}HelloController.php次にコントローラです。使用するModelクラスを指定して、find(‘all’)メソッド(allはオプション)で全件取得して、デバッグ表示をします。}}index.ctpViewは空で構いません。「http://localhost/cake/hello/」この場合だと、$data[0][‘Posts’][‘title’];に一件目の投稿のタイトルが入っていることになりますね。こんにちは!これはテスト投稿です。CakePHPを始めてみましょう。これはテスト投稿です。world!」のデータを抽出する例です。こんにちは!これはテスト投稿です。データの絞り込み(LIKE検索)postsテーブルのtitleの値に「Cake」を含むデータを抽出する例です。CakePHPを始めてみましょう。これはテスト投稿です。テーブルの関連付け($belongsTo)Postsを軸に考えると一対多の時の関係の時に使用します。投稿(Posts)が数レコードに対して対象の分類(Terms)が一です。関連するデータ(分類のデータ)を結合して自動で取ってきてくれます:)下記のSQLが発行されていることがわかります。テーブルの関連付け($hasMany)投稿(Posts)が1レコードに対して複数のコメント(Comments)があります。いう時は、hasManyを使用します。関連するデータ(コメントのデータ)を自動で取ってきてくれます:)下記のSQLが発行されていることがわかります。View最後はViewです。Viewは表示部分なので、一番とっつきやすい部分だと思います。今まで自動レンタリング機能について何度か書きましたが、これを独自のものにする方法です。なんに使えるのさ?ってことなんですけれど、ヘッダーとかフッターとか読み込むCSSとかあらかじめ必要な共通レイアウトを作っておくことでぐんと楽になります。「/lib/Cake/View/Layouts/default.ctp」ファイルを「/app/View/Layouts」内にコピーします。CSSやJS,画像などは「/app/webroot」に入れます。そのままの状態のdefault.ctpを見てみましょう。default.ctp注目して欲しい箇所にはハイライトを入れています。?>これはHTMLヘルパーと呼ばれるもので、HTMLヘルパーは様々なHTMLタグを出力してくれます。?>ページのタイトルを出力します。'ページタイトル');とかでセット出来るみたいです。‘ページタイトル’);」とかしてもダメになったみたいです。$this->Html->meta('icon');これは次のように出力されます。/>「favicon.ico」は「/app/webroot」に置きます。$this->Html->css('cake.generic');CSSファイルを読み込むタグを出力します。これは次のように出力されます。/>CSSファイルは「/app/webroot/css」に置いてください。(※CakePHP2.1から「$this->fetch('css')」となるようです。$scripts_for_layout;JSファイルを読み込むタグ展開します(Viewテンプレートから$this->Html->scriptとかで渡される)。(※CakePHP2.1から「$this->fetch('js')」となるようです。?>$this->Session->setFlashなどでセットされた値を表示します。$content_for_layout;Viewファイルの内容を表示します(ここ大事です)。今まで「/app/View/Hello」内に「index.ctp」とか「other.ctp」とか作ってきたと思いますが、Viewファイルとはそれらのことです。(※CakePHP2.1から「$this->fetch('content')」となるようです。?>発行したSQLのデバッグ情報を出力しています。Layout名の指定ControllerでLayoutを指定することができます。下記の例では「/app/View/Layouts/hello.ctp」というレイアウトファイルを使用します。formの値を取得する(実はViewでも可能)ControllerからsetメソッドでリクエストパラメータをViewに渡さなくてもViewでの取得が可能です。主催者@yandoさんのブログ8時間耐久CakePHP2勉強会を大阪と福岡で開催しました。ロジェクトを立ち上げた。舞鶴店」へ行って来ましたASP.NETとC#4.0を使ったWebサービスの作成とjQueryからの呼び出し方AboutTsuyoshi.福岡で働くWebクリエイターです。Type・CS-Cart・baserCMSなどのコミュニティに参加しています。無料写真素材サイトPAKUTASOでモデル&カメラマンとしても活動しています。詳しくはAboutをご覧ください。