.ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録

.検索

.メインメニュー

.フォーラムメニュー

.オンライン状況
7 人のユーザが現在オンラインです。 (6 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 7

もっと...

.
.リンク集

メイン
   一般的な話題(General)
     CakePHPシステムデザイン(最新規約)
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
shun
投稿日時: 2007-2-12 22:15
Cake 職人
登録日: 2006-7-14
居住地: 東京、日本
投稿: 1007
CakePHPシステムデザイン(最新規約)
公式マニュアルの規約は、
http://www.cakephp.jp/doc/conventions.html
にあります。

情報が確実に増えつつあるCakePHPですが、テーブルのフィールド名など、文書化されていないTipsもあります。この辺で、「暗黙の了解」のようになっている実用的なルールをまとめてみたいと思います。抜けている点、気が付いた点などありましたら、指摘してください!

複数形・単数形

・CakePHPは、Railsと同じように、複数形、単数形の規約があります。これに従っておくと、bake.php や scaffold を使用した時に、表の項目名、ページの見出しなどが自動的に正しく作成されます。
・テーブル名などが既に設計済みで変更できない、という場合には、$useTable="テーブル名"でマニュアル指定できます。CakePHP規約に従ったテーブル名にできないから、CakePHPは使えない、なんて思わなくて大丈夫です。ただ、RailsもCakeもその思想から、「複数プライマリキーを使うテーブル」には対応していないのでご注意ください。
・自分のプロジェクトの中で、新たに複数形を登録する必要などがある場合や、変化させない単語を登録するには、config/inflections.php を編集することで対応できるようです。
・複数形を作り出す機能そのものは、cake/inflector.php というファイルにあります。日本語のような、複数形がないパターンに完全対応させたい、などの場合にはこちらを編集できるかもしれません。
参考情報

posts というテーブルがあるとすれば、


<?php
/* posts テーブル: */
CREATE TABLE posts (
    
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    
title VARCHAR(50),
    
body TEXT,
    
created DATETIME DEFAULT NULL,
    
modified DATETIME DEFAULT NULL
);
?>



コントローラURL: (複数)/posts/メソッド名/パラメータ
コントローラ: (複数)PostsController (extends AppController)
モデル: (単数)Post (extends AppModel)
ビュー: (複数)app/views/posts/各メソッド.thtml
となります。

ちなみに、
post_types というテーブルがあった場合には、
コントローラURL: (複数)/post_types/メソッド名/パラメータ
コントローラ: (複数)PostTypesController (extends AppController)
モデル: (単数)PostType (extends AppModel)
ビュー: (複数)app/views/post_types/各メソッド.thtml
となります。

*この規約にならって作成しておくと、自動生成の際の見出し、項目名が正しく付き、コードが単純化し、分かりやすくなります。
(、となるはずです。

モデル

特定のフィールド名には特別な機能が付いています。

・テーブルの主キーは、"id"というフィールドで、primary、auto_increment で作るのが基本です。

・"モデル名_id"というフィールドを作るだけで、他のテーブルモデルへの外部キーとして設定できます。
例:users テーブルの中に、
"post_id" を作成  ⇒ posts テーブルの id を参照。
"post_type_id" を作成 ⇒ post_types テーブルの id を参照。
(使い方の詳細はこちらを参照)

・"created" (DATETIME)というフィールドを作成するだけで、新しいデータが入ると時間が自動的に記録されます。
・"modified" (DATETIME)というフィールドを作成するだけで、データが更新されるたびに時間が自動的に記録されます。
・"updated" (DATETIME)というフィールドを作成するだけで、データが更新されるたびに時間が自動的に記録されます。

・"title"というフィールドを作ると、そのページの標準のタイトル名として利用されます。
・"name"や"title"というフィールドを作ると、外部から参照された場合に(指定がなければ)その値がセレクトボックスなどの「選択項目名」として自動的に利用されます。(言い換えると、generateList()の引数が指定されていない場合にはこのように動作するということになります。)どちらもなければ、idの値がインデックスと項目名の両方に入ります。(このあたりの処理は、model_php4.phpと model_php5.php に書かれています。)

・ここまでの設定は、すべて手動で別な値を登録することが可能です。

-主キーの設定を手動で変更: 変数 $primaryKey
-参照テーブル名の変更: 変数 $useTable
-DBテーブルを使用しないモデルへ: 変数 $useTable=false
-セレクトボックスなどに表示する項目の変更: 変数 $displayField。(または、generateList()の引数でも指定可能。)
-外部キーの変更: 変数 $hasOne, $hasMany, $belongsTo, $hasAndBelongsToMany の配列パラメータ で指定

・使用しないほうがよい名前
-単なるhtmlを格納する場所として、/pages/があるので、pages というテーブルは作らないほうがよいと思います。(別名でモデルを作り、$useTableで"Page"と指定すれば、使えないこともないかもしれません。)
-テーブル名には、models, controlers, views, helpers, elements, behaviors, などのCakeが使用している名前も避けたほうがよいと思います。

ファイル構成

CakePHP のフォルダは一目りょう然の非常に分かりやすい構成です。理解しておくべきなのは、

app フォルダ …… 自分のプロジェクトファイルが入る
cake フォルダ …… CakePHP のコアファイル(基本的に編集してはいけない

ということです。では、cakeフォルダの中を編集したくなったらどうすればよいか、というと、「ファイルをcake フォルダからappフォルダの該当箇所にコピーし、そのファイルを編集する」と、そちらが使用されるようになります。

どういうことかというと、
-「model全体に影響を与える修正を加えたい」⇒「app_model.phpをcakeフォルダから、appフォルダ直下にコピーし、そのファイルを編集する。」
-「controller全体に影響を与える修正を加えたい」⇒「app_controller.phpをcakeフォルダから、appフォルダ直下にコピーし、そのファイルを編集する。」
-「helperの動きを日本語環境に合わせて編集したい」⇒「コアに含まれる該当するヘルパーを cake/libs/view/helpers から app/views/helpersにコピーし、そのファイルを編集する。」
-「基本デザイン(ヘッダ、フッタ、文字コードなど)を変更したい」⇒「layout.thtml default.thtml を cake/libs/view/templates/layouts から app/views/layouts にコピーし、そのファイルを編集する。」
-「コアに含まれる各エラー表示画面を自前のものに書き換えたい」⇒「各エラーファイル を cake/libs/view/templates/errors から app/views/errors にコピーし、そのファイルを編集する。」

などとすることができる、ということです。

コントローラ

CakePHP のURLルールは、

http://cakeパス/コントローラ名/メソッド名/パラメータ1/パラメータ2/....

という形になっています。たとえば、

http://cake.example.com/posts/view/3

というURLの場合には、

-使用されるモデル:Post(ファイル model/post.php)
-使用されるコントローラ: PostsController(ファイル controller/posts_controller)
-メソッド:PostsControllerクラスの、view メソッドが実行される。パラメータは 3 になる。

と動作します。パラメータは、


<?php
function view($id) {
        
$this->set('pet'$this->Pet->read(null$id));
    }
?>



の $id の中に入ってきます。(view($id,$id2=null,$id3=null)とすると、/controller/view/1/2/3 などに対応できます。)

ただ、Cakeのバージョンによっては、"0"というパラメータをカットしてしまう場合もあるので、別な方法として、$this->params['pass']を使う方法があります。

(参照:こちら

・ビューを出力する必要がないメソッドの場合には、

<?php
$this
->autoRender false;
?>


をコントローラのアクションの中で設定しておきます。無駄なビューファイルを作らなくてすみます。

テーブル未使用モデル、モデル未使用コントローラ

・「DBを使用しないモデル」や、「モデルを使用しないコントローラ」を作成することも可能です。

Shin x blog
CakePHPでDBアクセスなしのModelを作る
http://www.1x1.jp/blog/2006/09/cakephp_no_db_model.html

などに詳しく説明されていますが、

・DBを使用しないモデル⇒$useTable = false;
・モデルを使用しないコントローラ⇒ var $uses = array();、または var $uses = nullでOK。

アソシエーション

hasOne,hasMany,BelongsTo,hasAndBelongsToMany,などのアソシエーションを使うと、1回の操作で、外部キーでつながっている他のテーブルからの情報をまとめて取ってくることができます。

・関連データはいらない場合
コントローラ内で、

<?php
$this
->Model名->recursive=-1;
?>


としてから検索すると、そのテーブルのデータのみを取ってくることができます。ちなみにrecursiveとは、“何階層先の関連テーブルからの情報を取ってくるか”を指定できるパラメータです。

エラーハンドリング
/appディレクトリ直下にerror.phpを配置し、ErrorHandlerクラスのメソッドを独自のものに書き換えることができます。

実装例:
http://www.noswad.me.uk/MiBlog/EmailMeErrors
http://cakebaker.42dh.com/2006/06/15/writing-a-custom-error-handler
aokazu
投稿日時: 2007-2-14 6:12
Baker 常連
登録日: 2007-1-8
居住地: 浦安
投稿: 57
Re: CakePHPシステムデザイン(最新規約)
Aokazu と申します。

さっそくですが、
今までのシステムでは、基本的に英語でフィールド名を使用してきましたが、特定のフィールド(id,created,modified,title,name)以外は日本語で作成したほうが、フォーム作成などで日本語がそのまま入ってきますので楽できますよね?

これって問題ないのでしょうか?
文字コードは全部(OS,PHP,http_output) UTF-8 に統一しようと思います。

shun
投稿日時: 2007-2-14 11:43
Cake 職人
登録日: 2006-7-14
居住地: 東京、日本
投稿: 1007
Re: CakePHPシステムデザイン(最新規約)
う〜ん、それが“理想”ですね。ただ、それはフレームワークの問題というより、データベースとPHPが対応できているか、という話になりますよね。

1)データベースが、日本語テーブル、日本語フィールドに対応できるか。
2)PHPの文字列関数が、日本語を正しく処理できるか
3)フレームワークが、日本語を正しく処理できるか

データベースによって、対応できるレベルが違ったり、日本語を扱うためのルールがあったりするかもしれません。

MYSQLでは、たとえば4年前の話ですが、こんなのがありました。
Subject: [mysql 07174] 日本語項目名やテーブル名について
http://www.mysql.gr.jp/mysqlml/mysql/msg/7174

現状では、実務レベルで使えるとは思いません。
でもいつかはできてほしいですね!

(P.S ちなみに項目名の日本語化を楽する、という話ですが、これは何とかしたいなぁと以前から考えています。phpMyEdit というMYSQLデータ編集ページ生成ツールがあるのですが、これは、英語圏以外のところで開発されているからか、項目名の変更(翻訳)機能が、非常に明快便利なシステムなんですよね……。)
aokazu
投稿日時: 2007-2-28 7:57
Baker 常連
登録日: 2007-1-8
居住地: 浦安
投稿: 57
Re: CakePHPシステムデザイン(最新規約)
アドバイスありがとうございました。
現段階では NG ということですね。

DBを PostgreSQL を利用して試験を行った結果では使えそうではありました。

CREATE TABLE hotels (
id serial PRIMARY KEY,
ホテル名 text not NULL,
エリアコード text not NULL,
created timestamp(0) with time zone not NULL DEFAULT now(),
modified timestamp(0) with time zone
);

こんな感じでテーブルを作って、decorate.php とかで作ってみましたが、動作的な問題は感じませんでした。

ただ、最終的に複雑に利用するようになってから使えなくなっても困りますから、、、。今回はやめようかと思います。

スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 


. .