[CakePHP] 設定すべき8ファイル
CakePHP を通常の PHP からシフトして使ってみようと考えている人は結構いると思いますが、命名規則やファイルの設置など、決まり事が何かと多いという理由で嫌う人も多いと思います。
そこで CakePHP を動作させるのに最低限必要と思われる8つのファイルというのをまとめてみました。
CakePHP の動作というのは以下の条件をクリアした状態の事をいいます。
- 設置した URL を Web ブラウザで表示することができる
- データベースアクセスができ、データを取得することができる
(データベースを予め作成してあるものとします)
上記の条件を満たしつつ、これだけのファイルを設定すれば動作できるというのをまとめます。
(1ページの表示に関するファイルの設定についてになります)
初期設定ファイル(2ファイル)
まずは、CakePHP ダウンロード時のフォルダ構成から設定が必要なファイルというのを見ていきましょう。
設定するファイルは全て「app」フォルダ内のものだけになります。
- [ core.php の設定 ]
- セキュリティ関係とありますが、このファイルは Cakeコア部分の重要事項を設定するファイルで、この中の一部にセキュリティとして使われる文字列を設定する項目があります。
- セキュリティといっても、この先入力内容を問われることは無いので適当な文字列を入力しておいて構わないと思います。
- ファイルの真ん中よりちょっと下辺りに記述してある、
-
Configure::write('Security.salt', '(任意の英数字)'); // 〜 省略 〜 Configure::write('Security.cipherSeed', '(任意の数字)');
- これだけです。
- [ database.php の設定 ]
- データベースへアクセスするのための設定をするファイルです。
「database.php.default」というファイルが用意されていますので、それをコピーして語尾の「.default」を削除して使用します。
設定する内容は以下になります。 -
public $default = array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => '(ホスト名)', 'login' => '(ユーザー名)', 'password' => '(任意のパスワード)', 'database' => '(データベース名)', 'prefix' => '', 'encoding' => 'utf8', );
- それぞれのプロパティは設置先サーバーの情報を入力します。
「$default」の下に「$test」という変数がありますが、こちらの設定はいらないみたいです。
この2ファイルの設定で CakePHP が動作可能となります。
ですが、まだ準備が完了しただけです。後は最低限必要となるページの表示とデータ取得を作成しないといけません。
基本ファイルの生成
今回はサンプルとして、ユーザー一覧を表示させるページを作成してみます。
まずはデータベースへユーザーテーブルを作成します。
- [ ユーザーテーブル ]
-
フィールド名 名称 説明 id ユーザーID 主キー email メールアドレス 承認ID name ユーザー名 ユーザーの名前 password パスワード 認証パスワード created 登録日 登録した日付 modified 更新日 更新した日付 CREATE TABLE `users` ( `id` int(11) NOT NULL AUTO_INCREMENT, `email` varchar(255) NOT NULL, `name` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
- ※サンプルとして適当なデータを挿入しておきます。
テーブルを作成したら、Bake 機能を使用して必要となるファイルを一括で生成します。
Bake については過去記事「Bakeについて」を参照してください。
Mac の場合はターミナルで以下のコマンドを実行します。
- cd /(設置パス)/app/Console/
- ./cake bake all
基本となるファイルが生成できたら表示を確認してみます。
ブラウザで「(設置パス)/users/」にアクセスします。
ちゃんと表示できていますが、余分な部分を削除したり、足りない情報を追加したりと変更すべき内容が結構あります。
基本ファイルの編集(6ファイル)
ユーザー一覧を作成するのに必要な変更点をまとめたいと思います。
Bake で自動生成した基本ファイルの内、設定すべきファイルというのは以下になります。
-
ファイル名 説明 AppController.php 各ページに共通した処理(ログイン認証処理とか)を記述 UsersController.php ページ表示するためのデータ取得処理を記述 AppModel.php 各データベースに共通した処理(コンテイナブルとか)を記述 User.php データベース登録時のバリデーションや
データの関連を決めるアソシエーションなどを記述default.ctp 各ページのベースとなるレイアウトを記述 index.ctp ページの表示する内容を記述 - この6ファイルが主に設定が必要とされるファイルになります。
ですが、今回のサンプルで変更が必要なのが「UsersController.php」と「index.ctp」の2ファイルのみです。
「ビューファイル」にて表示そのものの変更を行います。
「モデルファイル」にてデータベースへのアクセス関係を変更できます。
「コントローラファイル」にて取得するデータの変更を行います。
また、それぞれに「ヘッダファイル」というものが存在し、そこで各ページでの共通の処理や簡単に使用できるモジュールの定義などを行えるようになっています。
ビューの変更(index.ctp)
まずは、表示に関するファイルを編集したいと思います。
レイアウトの変更は「 app / View / Layouts /」内の ctp ファイルを編集することで変更できます。今回のレイアウトはデフォルトのままを使用するので編集はしませんが、ページ内のヘッダー・フッター・サイドバーなどはこのファイルへ記述しておくことで、全ページ共通のレイアウトを設定できるようになっています。
今回は「 app / View / Users/ index.ctp 」のみを編集します。
編集内容は以下になります。
編集部分 | 変更内容 | 理由 |
---|---|---|
一覧のヘッダ文言 | 翻訳 | 英語なので日本語にします |
Id | 削除 | IDはいらないです |
Password | 削除 | パスワード表示はマズいです |
Modified | 削除 | 一覧に更新日は特に必要無いです |
Actions | 削除 | 一覧なのでいらないです |
(他にも色々と編集が必要ですが、今回はこのくらいで)
- [ 一覧のヘッダ文言の修正 ]
- デフォルトのソースコードから以下のように修正します。
-
<tr> <th><?php echo $this->Paginator->sort('id', 'ID'); ?></th> <th><?php echo $this->Paginator->sort('email', 'メール'); ?></th> <th><?php echo $this->Paginator->sort('name', '名前'); ?></th> <th><?php echo $this->Paginator->sort('password', 'パスワード'); ?></th> <th><?php echo $this->Paginator->sort('created', '登録日'); ?></th> <th><?php echo $this->Paginator->sort('modified', '更新日'); ?></th> <th class="actions"><?php echo __('アクション'); ?></th> </tr>
<tr> <th><?php echo $this->Paginator->sort('id'); ?></th> <th><?php echo $this->Paginator->sort('email'); ?></th> <th><?php echo $this->Paginator->sort('name'); ?></th> <th><?php echo $this->Paginator->sort('password'); ?></th> <th><?php echo $this->Paginator->sort('created'); ?></th> <th><?php echo $this->Paginator->sort('modified'); ?></th> <th class="actions"><?php echo __('Actions'); ?></th> </tr>
- 一覧のヘッダ文言が修正されています。
コード内の「sort(‘第一引数’, ‘第二引数’)」の第二引数に表示する文字を入力することで変更できます。
第一引数に文字を入力しても表示は変更されますが、ソート機能が使えなくなってしまうので気を付けましょう。 - [ 余分な項目の削除 ]
- デフォルトのソースコードから以下のように修正します。
-
<tr> <th><?php echo $this->Paginator->sort('email'); ?></th> <th><?php echo $this->Paginator->sort('name'); ?></th> <th><?php echo $this->Paginator->sort('created'); ?></th> </tr> <?php foreach ($users as $user): ?> <tr> <td><?php echo h($user['User']['email']); ?></td> <td><?php echo h($user['User']['name']); ?></td> <td><?php echo h($user['User']['created']); ?></td> </tr> <?php endforeach; ?>
<tr> <th><?php echo $this->Paginator->sort('id'); ?></th> <th><?php echo $this->Paginator->sort('email'); ?></th> <th><?php echo $this->Paginator->sort('name'); ?></th> <th><?php echo $this->Paginator->sort('password'); ?></th> <th><?php echo $this->Paginator->sort('created'); ?></th> <th><?php echo $this->Paginator->sort('modified'); ?></th> <th class="actions"><?php echo __('Actions'); ?></th> </tr> <?php foreach ($users as $user): ?> <tr> <td><?php echo h($user['User']['id']); ?></td> <td><?php echo h($user['User']['email']); ?></td> <td><?php echo h($user['User']['name']); ?></td> <td><?php echo h($user['User']['password']); ?></td> <td><?php echo h($user['User']['created']); ?></td> <td><?php echo h($user['User']['modified']); ?></td> <td class="actions"> // 〜 省略 〜 </td> </tr> <?php endforeach; ?>
- ヘッダ部分と内容部分のいらない項目を削除しちゃいます。
ビューファイルの表示内容がそのままページに表示されるので、削除したところの表示も当然消えます。
余分な項目を削除するには、ビューファイルの変更だけでも可能ですが、削除している訳ではなく、表示させていないだけです。
実際にはデータを取得してきているのに表示はしない、ということになりますので、余分にデータ取得をしてきていることになります。
完全に削除するにはデータ取得時の処理も削除しないといけないです。
コントローラの変更(UserController.php)
ビューにて表示させないようにした後は、データ取得もしないようにします。
無駄な処理が無いページの方が表示もスムーズになります。
データ取得の処理は「 app / Controller /」内の php ファイルで行っています。
今回は1ページだけの編集になりますので、ヘッダファイル(AppController.php)は触りません。
共通に使用するコンポーネント機能などを定義する場合は、このヘッダファイルに記述します。
今回は「UsersController.php」のみを編集します。
編集内容はビューの変更に基づいたデータ取得の削除です。
- [ 一覧のヘッダ文言の修正 ]
- デフォルトのソースコードから以下のように修正します。
-
public function index() { $this->User->recursive = 0; $param = array( 'fields' => array('email', 'name', 'created') ); $this->paginate = $param; $this->set('users', $this->paginate()); }
array(
(int) 0 => array(
’User’ => array(
’email’ => ‘aaa@bbb.jp’,
’name’ => ‘booyan’,
’created’ => ‘2013-03-22 00:00:00’
)
),
(int) 1 => array(
’User’ => array(
’email’ => ‘bbb@aaa.jp’,
’name’ => ‘boooyan’,
’created’ => ‘2013-03-22 00:00:00’
)
)
)public function index() { $this->User->recursive = 0; $this->set('users', $this->paginate()); }
array(
(int) 0 => array(
’User’ => array(
’password’ => ‘*****’,
’id’ => ‘1’,
’email’ => ‘aaa@bbb.jp’,
’name’ => ‘booyan’,
’created’ => ‘2013-03-22 00:00:00’,
’modified’ => ‘2013-03-22 00:00:00’
)
),
(int) 1 => array(
’User’ => array(
’password’ => ‘*****’,
’id’ => ‘2’,
’email’ => ‘bbb@aaa.jp’,
’name’ => ‘boooyan’,
’created’ => ‘2013-03-22 00:00:00’,
’modified’ => ‘2013-03-22 00:00:00’
)
)
) - デフォルトのソースコードでは、ページネート機能をそのまま利用して全てのデータを取得しています。
修正後では、表示に必要なフィールドのデータのみを取得するようにパラメータを設定しています。配列指定で取得してくるフィールドを email、name、created のみに設定しています。 - 取得データをデバッグ機能で確認すると、余分なデータは取得してないことが確認できます。
今回のサンプルデータは2つだけだったので、処理的には全く変わらないですが、データ量が1万とかになった場合はきっと変わってくると思います。
こういった小さな事からコツコツと、、、的な感じでコントローラ内はカスタマイズしていけると良いと思います。
モデルの変更(無し)
今回のサンプルではモデルの変更はありません。
ユーザー一覧を表示するだけなので、、、
サンプルでは作成しないですが、ユーザー一覧へユーザーを登録するといったページを作成する場合に、登録時の入力チェックや入力規則を持たせるためにバリデーションを設定する必要があります。
また、ユーザー一覧に各ユーザーの画像を持たせたりする場合には、データベース内にユーザー画像テーブルを設け、そのテーブルとユーザーテーブルとの関連を持たせるためのアソシエーションを設定する必要があります。
モデルファイルには、これらデータベース関係の設定を記述します。
今回のサンプルのようにユーザー一覧を表示するだけのページだと、モデルはいらないですが、サイト作成などのデータ登録機能がある場合、バリデーションの設定は必須です。
また、多数のデータテーブルが存在する場合は、それぞれのテーブルに関係性が成り立つため、アソシエーションの設定が必須になってきます。
まとめ
説明に使用したサンプルが簡単過ぎるという感じがしますが、だいたいのページでの表示はこんな感じで大丈夫だと思います。
ですが、これはあくまで基礎です。最低限の設定の場合です。
実際のサイトやホームページのヘッダファイルには、コントローラ処理をお手軽にするためにコンポーネント定義を記述したり、データ取得をより簡素化するために複雑なデータ構造を定義させたりしています。
自分の勝手な解釈ですが、ヘッダファイルやモデルは、はじめの基盤となるファイルという意味合いで使います。
ヘッダファイルとモデルファイルは初期設定ファイルと同じようなファイルとして作成しておきます。つまり、8ファイルの内6ファイルは初期設定ファイルとして最初に作成しておくということです。
そうすることで、ページを作成する際にはサンプルで紹介した2ファイルを変更するだけで良いことになるのではないかと思っています。
ちょっと深い話になりましたが、CakePHP を難しく考える必要はありません。
難しい機能が簡単に使えるようになるツールみたいな感覚で使用していければなと思います。
そのための基礎固めは大変かもしれませんが、後の楽さを考えれば頑張れるような気がします。
Comment