書籍概要

WEB+DB PRESS plus

CakePHP2実践入門

著者
発売日
更新日

概要

多くのPHPユーザに使われている「CakePHP」の解説書です。2011年10月にリリースされたCakePHP2に対応しています。はじめてCakePHPを使う方のために,サンプルアプリケーションを作りながら丁寧に説明します。サンプルコードはサポートページで公開しているので,実際に試しながら読むことができます。さらに,デプロイ方法やパフォーマンスチューニング,セキュリティについても解説します。稿末には,特に重要な設定ファイル,クラス,関数をまとめたリファレンスを収録しています。

こんな方におすすめ

  • これからフレームワークを使い始めたい初級者
  • CakePHP1系からCakePHP2系に移行したい中級者

本書に関するお知らせ

本書に関連する記事を公開しております。

目次

  • 本書に寄せて
  • はじめに
  • 本書の構成
    • 本書に登場するコード
    • サンプルコードのダウンロード
  • 執筆担当一覧

第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アプリケーションの実行シーケンス

  • あとがき

サポート

ダウンロード

本書で使用しているサンプルコードをGitHubで公開しています。

GitHub

正誤表

本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑 をおかけしたことを深くお詫び申し上げます。

正誤表(GitHubのWikiページ)

(2015年10月23日更新)

商品一覧