2012年5月5日土曜日

cakePHP2.xの命名規約

cakePHPだけでなく、フレームワークには命名規約っていうのがあるらしい。全員がそれに沿って作ることで、作業の分割化がスムーズにできるようになるのだとか。
今までフレームワークを触ったことがないぼくは、つい「面倒くさいな」って思ってしまうんだけど、そうしないわけにもいかないっぽいしね(完全無視でも非効率ながらできるっぽいけど)。そんなわけで、それぞれの命名の仕方をまとめてみた。

(以下、全部CookBook日本語版に書かれてることを単にまとめただけです。hasAndBelongsToManyやcounterCacheといった場合の命名規約はその際に書くとして今回は端折って基本と思える部分だけを書きます)

基本──キャメル型とアンダースコア型、複数型と単数型

cakePHPはこの4つの形を使って命名していくらしい。

■キャメル型
senddataSendData
bigareaBigArea
みたいに、単語の頭をそれぞれ大文字にして書く。殆どがこのキャメル型で記述する。

■アンダースコア型
senddatasend_data
bigareabig_area
単語を連結する際にアンダースコア(_)を入れる。CakePHP1.3まではファイル名はこれで記述するルールだったみたいだけど、2.xからはコントローラーやモデル名はキャメル型に統一され、今はテーブル名とビューファイルだけ(?)をアンダースコア型で記述する。

■複数型での記述
複数型は、厳密に英語の名詞が複数形になるのと同じ変化の形で記述する。 データベースを扱う場合のコントローラー、及びテーブル名は主に複数型となる。
apple → apples
moneymonies
personpeople
childchildren
よくできてるなぁ。なお、2つの単語を組み合わせる場合は
senddatasend_datas

テーブルとフィールドの規約
テーブル名

【アンダースコア型】【複数形】で作成

(例)
applespeoplechildrenbig_cities

newsinfomationというような不加算名詞はそのまま作成する。
※ただし、モデルで使用テーブルを指定する場合は上記の規則に捉われないっぽい。

フィールド名

【アンダースコア型】【単数形】で記載
(別に基本複数でも問題ないっぽいけど単数形じゃないとダメなのもあるから単数形統一がいいかも)

(例)
bodyfirst_namechild_first_name

■フィールド名の規約
主キーid
※モデル内で他の指定も可
外部キー参照元のjoinテーブル名(単数形)_id
peapleテーブルとjoin→person_id
big_citiesテーブルとjoin→big_city_id
作成日時created(datetime型)
レコード作成時に自動で日時が入る
更新日時modified(datetime型)
レコード作成/更新時に自動で日時が更新
見出しtitleまたはname
※モデル内で他の指定も可

なお、cakePHP1.3ではupdatedmodifiedと同じ動作をすると書いてるんだけど、2.xCookBookではその記載は消えてた(拙い英語力で単に見つけられなかっただけかも)。2.0移行ガイドを読んでも削除されたとは書かれてないから使えるかもしれないけど、使わなくても全然問題ないので使わない方向で行きます。

■その他の規約

(名前は何でも)tinyint(1)smallint(1)でブーリアン値と認識
※Mysqlの場合。0か1しか入らなくなるし、検索でも2以上を検索しようとすると自動で1にされてしまう。このおせっかいはtinyint(2)以上にすることで回避できるっぽい。

cakePHPは複合主キーは基本サポートしない
できなくはないけど、いろいろな便利機能は使えなくなるみたい。

主キーは数値型のauto_incrementを指定するか、char(36)を指定
char(36)を指定すると、自動的にユニークなUUIDを作ってくれるようになる。
ただ、MysqlのInnodbを使う場合はインデックス全てに36バイト分の主キーが加わってデータがやたらと大きくなるし、最悪断片化も起きてパフォーマンスがかなり落ちるからInnodbを使う場合はint型で作った方がいいと思う(MyISAMなら問題ない)。

モデルの規約

app/Model/内に作成する

テーブル名を【キャメル型】【単数形】で記載

テーブル名[people]用のモデルを作成する場合
ファイル名Person.php
クラス名Person
【基本の型】
//[Person.php]
<?php
   class Person extends AppModel{

   }
?>

他のリファレンスを見ると、よく中にpublic $name = 'Person';と書いてるのがあるけど、これはPHP4との互換用にあってPHP5以上を使う場合は特に必要ないらしい。
テーブルを指定する場合は$useTable = '[テーブル名]'と記載する。

コントローラーの規約

app/Controller/内に作成する

関連させるモデルクラスの【キャメル型】【複数形】+Controller

モデル[Person]を使用するコントローラーを作成する場合
ファイル名PeopleController.php
クラス名PeopleController
【基本の型】
//[PeopleController.php]
<?php
   class PeopleController extends AppController{

   }
?>

たったこれだけで、Personモデルと関連付けが行える。
なお、モデルを使用しない場合は好きな名前+Controller.phpで作成可能。
また複数のモデルを使用する場合、$usesの配列で指定する(その場合、自身のモデルも記載)。使用モデルを別で指定する場合も$uses内に記載する。

//[PersonモデルとChildモデルを使用する場合]
<?php
   class PeopleController extends AppController{
       public $uses = array('Person' , 'Child');
   }
?>
//[Userモデルを使用する場合]
<?php
   class PeopleController extends AppController{
       public $uses = array('User');
   }
?>
アクションの規約
■アクションとは

コントローラ内に入れる関数。基本は、ひとつのアクションがひとつのページとなる…みたいな認識でいいのかな。いいのだと思う。

cakePHPで作成したアプリケーションは、原則としてURLが

http://localhost/cakeフォルダ/[コントローラ名]/[アクション名]/([引数1]/[引数2]/...)

という形になる(/Confg/routes.php内で変更可能)。
アクションを端折った場合はindex()が呼び出される。index()がないと、エラーになる。
またURLに指定するコントローラ名はキャメル型でもアンダースコア型でもどっちでもアクセスされる。

//簡単なコントローラーの例(Cakeフォルダをcakephpと指定した場合)
<?php
   class PeopleController extends AppController{
        public function index(){
           //(indexでの動作)
           //http://localhost/cakephp/people/index/で呼び出される
           //http://localhost/cakephp/people/でも呼び出し可
        }
        
        public function edit($id = null){
           //(indexでの動作)
           //http://localhost/cakephp/people/edit/1 で呼び出される。
           //上記の場合$idには1が入る。
        }
   }
?>
■アクションの規約

・URLでアクション名を指定しなかった場合index()が呼び出される
これは上で書いた通り。

・内部的に使いたい関数は先頭にアンダースコア(_)をつける。
こうすると、URLで呼び出せなくなる。public function _setresult(){}というような形で記述。

ビューの規約

app/View/内に作成する

フォルダ→コントローラーの【キャメル型】で記載
その中のファイル→アクションを【アンダースコア型】+.ctp

[PeopleController]で使用するビューファイル
ディレクトリ名People
アクションindex() → index.ctp
edit() → edit.ctp
その他の規約
コンポーネント

app/Controller/Component内に作成する

ファイル名【名前(キャメル型)】+Component.php
SampleComponent.php
宣言class SampleComponent extends Component
ビヘイビア

app/Model/Behavior内に作成する

ファイル名【名前(キャメル型)】+Behavior.php
SampleBehavior.php
宣言class SampleBehavior extends ModelBehavior
ヘルパー

app/View/Helper内に作成する

ファイル名【名前(キャメル型)】+Helper.php
SampleHelper.php
宣言class SampleHelper extends AppHelper

最初は覚えるのが億劫だったけど、全体的に見ても規則性があるから結構覚えやすいかもっていうのが印象でした。

なお余談だけど、この複数型/単数型の読み取りと変換はlib/Cake/Utility/Inflector.phpで行ってるようで、ざっと見てみたところ、イレギュラー変換用のリストの中に、person => peopleの上にはpen○sが、その下にはs○xが並んであった。
どうでもいいんですけどね。イレギュラーのリストはちゃんとアルファベット順に並んであるから単純にそうなるものってだけかもしれないし、ただ上のルールリストの中にもちゃんとperson→peapleとなるような正規表現が記述されてあって、ちょっと気になったってだけですから。それにこのsexは性別を表してるっぽいし。


[参考リンク]
CakePHP2.x CookBook(英語版)
CakePHP2.x CookBook(日本語版)
CakePHP1.3 CookBook(日本語版)

0 件のコメント:

コメントを投稿