目次
- 本書に寄せて
- はじめに
- 本書の構成
- 本書に登場するコード
- サンプルコードのダウンロード
- 執筆担当一覧
第1章:Webアプリケーションフレームワークの誕生
1.1 従来型のPHP開発スタイル
1.2 PEAR,Smartyなどのライブラリの普及
ライブラリを使わない開発の限界
- 重複するコードが増える
- ロジックとデザインが混在する
- コードのスタイルが不統一になる
ライブラリの登場
1.3 MVCフレームワークの登場
MVCを構成する要素
- Model(モデル)
- View(ビュー)
- Controller(コントローラー)
初期に誕生したフレームワーク
- Mojavi
- Ethna
Ruby on Railsの影響
- 同じことを繰り返さない(DRY)
- 設定より規約(CoC)
現在のフレームワーク事情
- CakePHP
- symfony
- CodeIgniter
- Zend Framework
- Lithium
- Symfony2
フレームワークを活用しよう
- 【column】CakePHPコミュニティ
第2章:CakePHPの概要
2.1 CakePHPの特徴
初心者にも学びやすいMVCフレームワーク
柔軟なオープンソースライセンス
設定作業がほとんど必要ない
データベースへのアクセスが簡単
国内外で幅広いユーザに利用されている
2.2 開発体制と歴史
CakePHPの誕生
CakePHP 1.2
CakePHP 1.3
CakePHP 2.0
CakePHP 2.1
CakePHP 2.2
CakePHP 3.0
2.3 Webサイトなどでの採用実績
nanapi
Livlis
tipshare.info
Croogo
baserCMS
CandyCane
2.4 情報の集め方
ドキュメントを読む
- 公式ドキュメント
質問する
- 日本語フォーラム
- CakePHP Questions
- IRCチャンネル
バグを報告する,修正する
イベントやコミュニティへ参加する
第3章:CakePHPを試してみよう
3.1 CakePHPのインストール
PHP,Apache,PDOのセットアップ
CakePHPのダウンロード
動作確認
mod_rewriteを有効にする場合
App.baseUrlを利用する場合
セキュリティ設定の変更
app/tmpディレクトリの権限変更
データベースの接続設定
Windowsの場合の注意点
Mac OS Xの場合の注意点
3.2 CakePHPのディレクトリ構成
特に頻繁に利用するディレクトリ
応用的な使い方に関連するディレクトリ
- Component──コントローラーを拡張する
- Behavior──モデルを拡張する
- Helper──ビューの処理を拡張する
編集してはいけないディレクトリ
- 【column】CakePHPの命名規約
3.3 bakeによるソースコードの自動生成
データベースの作成
bakeコマンドの実行
動作確認
- 【column】bakeの発展的な利用方法
- 【column】さくらインターネットでCakePHPが動かない?
第4章:コントローラーを使う
4.1 コントローラーとは
記述方法
アクション
ディスパッチャ
AppControllerクラス
4.2 コントローラーに設定できるプロパティ
$scaffoldプロパティ──ひな型の有効化
$usesプロパティ──利用するモデルの指定
$helpersプロパティ──利用するヘルパーの指定
$componentsプロパティ──利用するコンポーネントの指定
4.3 コントローラーの機能
renderメソッド──ビューを表示
setメソッド──ビューへのデータの引き渡し
redirectメソッド──別画面への転送
flashメソッド──別画面へのメッセージ付き転送
$requestプロパティ──ユーザ入力値などの取得
そのほかの便利なメソッド
4.4 コントローラーを使ってみよう
タスク管理アプリケーションの作成
データベーステーブルの作成
コントローラーの作成
アクションの作成──タスク完了から一覧への遷移
ビューテンプレートの表示──タスク一覧を表示する
モデルの呼び出し──未完了タスクのみの表示とタスクの更新
フォームの利用──タスクの新規登録
4.5 まとめ
第5章:モデルを使う
5.1 モデルとは
ファイルの作成
AppModelクラス
5.2 モデルに設定できるプロパティ
$useTableプロパティ──利用するモデルの指定
$primaryKeyプロパティ──主キーの指定
$useDbConfigプロパティ──利用する接続の指定
$virtualFieldsプロパティ──仮想カラムの指定
$displayFieldプロパティ──ドロップダウンリストなどへの表示項目の指定
$actsAsプロパティ──有効にするビヘイビアの指定
$validateプロパティ──入力検査の設定
アソシエーションの設定
その他のプロパティ
5.3 モデルの機能
findメソッド──データの取得
find('all')──まとめてデータを取得
- 全件のデータを取得する
- 絞り込み条件や取得件数,ソート順などを指定する
find('count')──データの件数を取得
find('first')──データを1件だけ取得
find('list')──データを単純なリストで取得
find('threaded')──データをツリー形式で取得
find('neighbors')──隣接するデータの取得
マジックfind──条件をメソッド名から指定
queryメソッド──SQLの直接実行
saveメソッド──データの保存
- INSERTを実行する場合
- UPDATEを実行する場合
- 連続してINSERTを行う場合
saveFieldメソッド──単一カラムの更新
deleteメソッド──データの削除
saveManyメソッド──複数件のデータの保存
updateAllメソッド──条件に当てはまるデータの同時更新
deleteAllメソッド──条件に当てはまるデータの一括削除
5.4 バリデーションでデータが正しいかをチェック
単一のバリデーションルールを適用
複数のバリデーションルールを適用
独自のバリデーションルールを適用
5.5 アソシエーションで複数のモデルを操作
アソシエーションの種類
- belongsTo
- hasMany
- hasOne
- hasAndBelongsToMany
取得するデータの範囲指定
アソシエーションを実行時に設定
5.6 モデルを使ってみよう
バリデーションの設定──入力項目の正しさをチェックする
- モデルクラスを作成する
- コントローラーに処理を追加する
- ビューに処理を追加する
アソシエーション設定の追加──タスクにメモを複数付加できるようにする
- テーブルを作成する
- Noteモデルへアソシエーションを設定する
- Notesコントローラーを作成する
- Taskモデルへアソシエーションを設定する
- Tasksコントローラーは変更なし
- ビューファイルへメモの表示処理を追加する
5.7 まとめ
第6章:ビューを使う
6.1 ビューとは
ビューファイルの作成
6.2 ビューの使い方
レイアウトでヘッダ,フッタを変更する
エレメントでページの要素を共有する
JSONやXMLを利用する
ZIPファイルなどをダウンロードさせる
テーマを使って見た目を切り替える
6.3 ヘルパーを使ったモデル,コントローラーの連携
HTMLヘルパー
Formヘルパー
そのほかのコアヘルパー
6.4 ビューを使ってみよう
タスク表示のエレメント化
コントローラーに編集機能を追加
ビューファイルの作成
6.5 まとめ
第7章:CakePHPのMVCをさらに使いこなす
7.1 コンポーネント,ビヘイビア,ヘルパーの活用
7.2 コンポーネントでコントローラーを強化
コンポーネントとは
CakePHPが用意するコアコンポーネント
Authコンポーネントで認証機能を実現
- 認証の設定
- ログイン処理の実装
- Authコンポーネントの設定をカスタマイズ
Paginationコンポーネントでページ分けを実現
- コントローラー側の記述
- ビュー側の記述
コンポーネントの自作
7.3 ビヘイビアでモデルを強化
ビヘイビアとは
CakePHPが用意するコアビヘイビア
- Containableビヘイビアで取得する関連データの範囲を設定する
ビヘイビアの自作
7.4 ヘルパーでビューを強化
ヘルパーとは
CakePHPが用意するコアヘルパー
ヘルパーの自作
7.5 まとめ
第8章:コアライブラリを使ってフレームワークを使いこなす
8.1 コアライブラリとは
主なコアライブラリ
8.2 コアライブラリの使い方
Appクラスでライブラリを読み込む
- App::usesを使ってフレームワークの動作に介入する
- App::usesを使って外部のライブラリを読み込む
- App::importを使って外部のライブラリを読み込む
Setクラスを使って複雑な連想配列を扱う
- Set::extractで配列から特定のデータを抽出する
- Set::combineでキーと値のリストを生成する
- Set::diffで配列同士を比較する
- Set::sortで特定のキーを基準に配列をソートする
8.3 まとめ
第9章:CakeEmailクラスを使ったメール送信
9.1 CakeEmailクラスとは
事前準備
簡単なメール送信のサンプル
9.2 CakeEmailクラスの設定メソッド
メールアドレスに関わるメソッド
メールヘッダに関わるメソッド
- メールヘッダインジェクション対策
9.3 CakeEmailクラスの活用
ファイルを添付したメールの送信
- 単純にファイルを添付する
- ファイル名を変えて添付する
- 複数のファイルを添付する
テンプレートを使ったメール送信
- レイアウトとビューを作成する
- メールを送信する
- 【column】メソッドチェイン
- 動作確認する
CakeEmailクラスの動作に関するメソッドのまとめ
設定ファイルの利用
9.4 まとめ
第10章:プラグインを使ったフレームワークの拡張
10.1 著名なプラグイン
DebugKit
- インストールする
- 利用する
Search plugin
MigrationsPlugin
- インストールする
- 利用する
10.2 プラグインを自作する
bakeコマンドでスケルトンを作成
コードの記述方法
10.3 まとめ
第11章:コンソール/シェルの利用
11.1 コンソールとは
コンソールから動かしてみる
CakePHPが用意しているシェル
11.2 シェルを自作する──掲示板アプリケーションの操作
カテゴリを一覧表示する処理を作成
カテゴリの追加処理を作成
- 【column】エラーを処理するには
カテゴリの削除処理を作成
ヘルプを表示する処理を作成
- 【column】タスクを使って共通処理を整理する
- 作成するヘルプの実行結果
- getOptionParserメソッドをオーバーライドする
- addSubcommandメソッドの引数
確認メッセージなしで削除できるオプションを追加
11.3 まとめ
- 【column】シェルでもタスクでもない場合
第12章:ユニットテスト
12.1 ユニットテストの効率化
12.2 CakePHPでのユニットテスト
PHPUnitのインストール
環境整備
- デバッグレベルを確認する
- テスト用データベースを準備する
ブラウザからのテスト
コンソールからのテスト
カバレッジの確認
- ブラウザから確認する
- コンソールから確認する
12.3 テストケースの作成
PHPUnitを使ったユニットテストとは
モデルのテスト
- 自動生成されたテストケースのひな型を確認する
- フィクスチャを利用する
- 入力チェックをテストする
- 独自に作成した検索処理をテストする
- テストを実行する
- テストがエラーになったら
コントローラーのテスト
- ビューに渡された値を評価する
- HTMLを評価する
- 例外を評価する
- リダイレクトを評価する
- フォームのPOSTを評価する
- テストを実行する
コンポーネントのテスト
ヘルパーのテスト
- ヘルパーがほかのヘルパーを利用している場合
12.4 継続的インテグレーションとの統合
Jenkins
- テストジョブを追加する
- 全テスト実行クラスを作成する
- ビルドを実行する
12.5 まとめ
テストコードはプログラマにとって安心を得る道具
- 【column】テストシェルのオプション
第13章:セキュリティ
13.1 なぜセキュリティに気を配る必要があるのか
13.2 代表的な攻撃を防ぐ
データベーステーブルとサンプルデータの作成
SQLインジェクション
- 対策1:モデルのメソッドを使う
- 対策2:DataSourceクラスのfetchAllメソッドを使う
クロスサイトスクリプティング(XSS)
- ケース1:変数の値をビューファイルで出力する
- ケース1の対策:h()関数を使う
- ケース2:フォームに変数の値を出力する
- ケース2の対策:Formヘルパーを使う
クロスサイトリクエストフォージェリ(CSRF)
- CSRFが発生する例
- 対策:Securityコンポーネントを使う
- 注意点1:フォームを作成する場合
- 注意点2:JavaScriptでフォーム要素を動的に変更する場合
- 注意点3:Ajaxで画面遷移を伴わずPOSTリクエストを送る場合
セッションハイジャック
- 対策1:セッションIDを自動で変更する
- 対策2:セッションIDを任意のタイミングで変更する
13.3 CakePHP特有の問題を防ぐ
意図しないコントローラーメソッドの実行
- 対策1:メソッドのアクセス制御子をprotectedかprivateにする
- 対策2:メソッド名をアンダースコアから始める
細工をしたフォームによる意図しないデータ更新
- 対策1:Securityコンポーネントを使う
- 対策2:登録するパラメータだけを抽出する
- 不十分な対策:モデルのsaveメソッドで更新パラメータを指定する
認証をかけているつもりでも処理が動作してしまう
- 要注意個所1:コントローラーのbeforeFilterメソッド
- 要注意個所2:$componentsプロパティで指定しているコンポーネント
13.4 まとめ
- 【column】アクションごとにモデルを作る
第14章:公開環境の設定とデプロイ
14.1 動作環境切り替えの必要性
14.2 動作環境の切り替え
ホスト名による切り替え
環境変数による切り替え
14.3 データベースの切り替え
AppModelによる切り替え
database.phpによる切り替え
14.4 公開環境構築時の注意点
デバッグレベルの設定
test.phpの無効化
アプリケーションログの運用
バージョンアップ時のキャッシュ削除
faviconのカスタマイズ
14.5 デプロイ
シェル+rsyncを使用したデプロイ
Capistranoを使用したデプロイ
- Capistranoをインストールする
- capifyでデプロイに必要なファイルを生成する
- capcake用の処理を追加する
- deploy.rbをカスタマイズする
- デプロイを準備する
- デプロイを実行する
- 便利な機能
第15章:キャッシュによるパフォーマンス改善
15.1 パフォーマンスが悪い
15.2 ボトルネックの調査
計測する方法を考える
計測用アプリケーションを作る
パフォーマンスを計測する
15.3 Cacheクラスを使ったパフォーマンスの改善
キャッシュとは
キャッシュの設定
Cacheクラスの操作
- キャッシュを書き込む
- キャッシュを読み込む
- キャッシュを削除する
Cacheクラスを実際に使ってみる
- 設定を行う
- 動作確認する
15.4 ビューキャッシュを使ったパフォーマンスの改善
ビューキャッシュを有効に
ビューキャッシュの設定
一部分をビューキャッシュの対象から除外
ビューキャッシュの削除
- ビューキャッシュの有効期間を経過した場合
- モデルのsaveメソッドもしくはdeleteメソッドを実行した場合
- clearCache関数を実行した場合
ビューキャッシュを実際に使ってみる
- 設定を行う
- 動作確認する
15.5 まとめ
- 【column】エラー時の処理とカスタマイズ
第16章:ソーシャル連携
16.1 WebサービスとSNSを連携させる重要性
16.2 OAuthの概要
アプリケーションの登録
OAuth 1.0のアプリケーション承認の流れ
OAuth 2.0のアプリケーション承認の流れ
16.3 著名なプラグインの紹介
TwitterKit
CakePHP Facebook Plugin
16.4 TwitterKitを使ってみよう
設定手順
- 導入する
- Twitterデータソースを設定する
- Twitterユーザ用のテーブルを作成する
- AppController.phpに設定を追加する
- jQueryを読み込む設定
動作確認
- ログインする
- ホームタイムラインを取得する
第17章:CakePHP1系からの移行
17.1 現在メンテナンスされているバージョン
17.2 CakePHP 1.xと2.xとの違い
ディレクトリ構造,ファイル命名ルールの変更
- ファイル名,ディレクトリ名の表記方法
- ヘルパーファイル名やコンポーネントファイル名の表記方法
リクエスト,レスポンスデータの管理
クラスの遅延読み込み
パフォーマンスの向上
17.3 移行時の注意点
プラグインファイルの読み込み指定
controller/modelの階層ディレクトリの探索
Appクラスファイルが自動読み込みされなくなった
初期ファイルの修正が必要な個所
APCキャッシュが利用されるケース
17.4 Upgrade shellを使った移行
Upgrade shellとは
Upgrade shellの実行
CakePHP 1.3のコードにUpgrade shellを適用
- database.phpを修正する
- キャッシュファイルを削除する
- 【column】CakePHPを作っているのは誰か?
第18章:より優れたプログラムをCakePHPで書くために
18.1 モンブランコードを避ける──より簡潔でわかりやすいコードに
モンブランコードとは
コントローラーを小さくする
テストコードを意識する
メソッドの役割を小さくする
18.2 スポンジの再発明を避ける──公開されているコードを活用する
スポンジの再発明とは
Bakeryで探す
GitHubで探す
CakePackagesで探す
18.3 ユニットテストを導入する──テストを書く意義と重要性を知る
18.4 Think outside the box──良いアイデアを幅広く取り入れる
Appendix:CakePHPチートシート
A.1 チートシートの見方
A.2 定数
A.3 core.phpの設定
A.4 コントローラー
プロパティ
メソッド
A.5 コンポーネント
プロパティ
メソッド
A.6 モデル
プロパティ
メソッド
A.7 ビュー
プロパティ
メソッド
A.8 CakeRequestクラス
プロパティ
メソッド
A.9 CakeResponseクラス
メソッド
A.10 グローバル関数
A.11 規約
データベース
コントローラー
モデル
ビュー
A.12 CakePHPアプリケーションの実行シーケンス
- あとがき