なんやかんやでPHPのフレームワークはCakePHPに落ち着いてしまう私ですが、しばらく開発期間が空いてしまうと色々細かい部分を忘れてしまうし、CakePHP2系の情報が1系に比べると少ない気がするので、一旦まとめてみようかと。ちなみに、対応バージョンは安定版の2.2.1です。
パーミッションエラーの場合は、シンボリックリンク貼ったディレクトリの親ディレクトリのパーミッションをチェック(←未来の私用です。Linuxのeclipseで開発する時は、workspaceに置いてシンボリックリンク貼るようにしている)。
その他50XのInternal Errorはmod_rewriteを怪しむ。cpした場合は、.htaccessなどがコピーできてないかも。
そのあたりが解決すれば、CakePHPのwelcome的なページが表示される。手を入れていない場合は、tmpディレクトリのパーミッション設定
一気に3、4個のエラーは解消できる。本当はapacheやらをオーナーにして書き込み権限を与えるのが正解だと思うがそれの議論は本質ではないのでパス。
次はDBの設定。ホスト名、ユーザー名、パスを入れる。UTF-8の指定をコメントアウトしてもいい。その場合はDBやテーブル自体がLatin1になってないかチェックする。まじうざいから。
ソルトの設定。文字列を直接書き換えてもいいし、後ろに好きな文字を付け足してもいい。これは2箇所(Security SaltとCypher Seed)。
これでひとまずの設定は終わり。ここから開発に突入できます。
Ubuntuはデフォルトでmod_rewriteが有効になっていない。
httpd.confとかその辺でAllowOverride All的な設定をすると幸せ。
2系のcookbookはリンクが見つからなかったけれど翻訳済のものがアップされているので、適宜確認する。 → CakePHP Cookbook v2.x documentation(日本語)
findの第一引数には色々種類がある。
Cookbookからのコピペだけど、これはかなり便利。
データ入力などの業務系のアプリを作るなら、素直にCakePHPのO/Rマッパーとadd()、edit()、delete()、routerで作ったほうが圧倒的に速い。工数を細かいチューニングに割けるようになる。ただしある程度習熟してたらの話。いきなりは無理。私も無理。だからこうやってまとめているのです。
詳しくはAPIのドキュメントにオプションが取りうるパラメータがリストアップされているのでチェック → Model - CakePHP API
ということで、CakePHPが用意したオブジェクト経由で$_GET、$_POSTにアクセスする。
以上はフォームの入力データを手っ取り早くDBへ突っ込むコード。バリデーションはModelに書くのでControllerでは意識しない。
バリデーションは空白ダメとか○文字以上○文字以下とかから正規表現を使ったこじゃれたものや、独自の関数を通してガッツリバリデーションすることもできる。
以下、APIのドキュメントからコピペ(ページが長くてアンカーがなかったので)。
最近のBootStrapは高機能になってきて、JavaScriptやlessなんかも取り込んでだんだん大きくなってきている。よくわからない事も多々あるけれど、とりあえず使いたいという場合は、
以上の3つのディレクトリの中のファイルをwebroot直下にある同名のディレクトリにコピーすれば完了です。
ちなみにコンパイルできなかった人はnodeをインストールしてから
とすると、コンパイルに必要なツールが揃います。
いつからかnpmは同梱されるようになったんですねぇ。
さて、bootstrapを準備したら、CakePHPのLayoutディレクトリにあるdefault.ctpにbootstrap読み込み用のタグを追記する。
これで追加完了。CakePHPデフォルトのCSSと衝突する可能性もあるので、bootstrapの方が後に読み込むように調整する。
CakePHPのデフォルトCSSを読まないと、SQLクエリの実行結果表示が腐るので、邪魔している部分は別途CSSを用意してCakeデフォルトを上書きするか、潔くデフォルトを捨てるか。SQLの実行結果はテストで利用することもあるのでソースコードのテストが終わるまでは残して、本番では使わない、でいいと思います。適当にやってください。
良い感じにまとまっている資料があるので、1.2系用のものだけれどチェックしてみてください。割とそのまま使えます。 → 極める routes.php (CakePHP 1.2)
後は詰まったら詰まった時に検索、もしくは初心に戻ってCookBook、もしくはAPI Documentでなんとか乗り切ってください。
PHPでなら書けるのに、CakePHPの機能を一生懸命探すのは、割と時間の無駄な時もある(特にDBのクエリなど)ので、フレームワークに頼らない書き方でケリをつけるのもアリだと思います。またリファクタリングする時が来るまでに勉強しておきましょうって感じでどうでしょう?
see also:
CakePHPの細かいTIPS Twitter Bootstrapとの絡みとか
CakePHP2.2.1の入手
入手については、こちら、もしくはgithubからgit cloneするかしてください。初期設定
ダウンロードしたファイルを展開してウェブ領域にコピーすれば設置完了。パーミッションエラーの場合は、シンボリックリンク貼ったディレクトリの親ディレクトリのパーミッションをチェック(←未来の私用です。Linuxのeclipseで開発する時は、workspaceに置いてシンボリックリンク貼るようにしている)。
その他50XのInternal Errorはmod_rewriteを怪しむ。cpした場合は、.htaccessなどがコピーできてないかも。
そのあたりが解決すれば、CakePHPのwelcome的なページが表示される。手を入れていない場合は、tmpディレクトリのパーミッション設定
#エラーが出てるディレクトリまで掘ってから chown -R 0777 tmp
一気に3、4個のエラーは解消できる。本当はapacheやらをオーナーにして書き込み権限を与えるのが正解だと思うがそれの議論は本質ではないのでパス。
次はDBの設定。ホスト名、ユーザー名、パスを入れる。UTF-8の指定をコメントアウトしてもいい。その場合はDBやテーブル自体がLatin1になってないかチェックする。まじうざいから。
ソルトの設定。文字列を直接書き換えてもいいし、後ろに好きな文字を付け足してもいい。これは2箇所(Security SaltとCypher Seed)。
これでひとまずの設定は終わり。ここから開発に突入できます。
Ubuntuはデフォルトでmod_rewriteが有効になっていない。
a2enmod rewrite
httpd.confとかその辺でAllowOverride All的な設定をすると幸せ。
基本的な事
- 私の場合は、Controllerを作ってからViewを作り、Modelを作る。だいたい、Controllerで全力を使うので、Viewがありませんというエラーを見て、Modelがないというエラーを見る。
- ControllerとViewは複数形で命名、Modelは単数形で命名というのをよく忘れる。
- メンバ変数、$helpersにViewで使いたいヘルパーを書く。とりあえずは、「var $helpers = array("Html", "Form");」を書いておけば、Viewの時に困らない。
2系のcookbookはリンクが見つからなかったけれど翻訳済のものがアップされているので、適宜確認する。 → CakePHP Cookbook v2.x documentation(日本語)
DB検索
// Controller内 // where句はconditionsというArrayを作る $this->Post->find("all", array("conditions"=>array("sex"=>"male", "country"=>"ja"))); // 欲しいフィールドだけ $this->Post->find("all", array("fields"=>array("name", "age"))); // 並び順 $this->Post->find("all", array("order"=>"asc"));
findの第一引数には色々種類がある。
- all
- 条件(conditions)に合致する行を全て取得する
- first
- 条件(conditions)に合致する先頭の1行だけ取得する
- count
- 条件(conditions)に合致する行数を取得する
- list
- 条件(conditions)に合致する行をFormで加工しやすい形にして取得する
- threaded
- 謎.oO(配列をネストして構造化されたデータが返ってくるようだけれど、使い方が難しそう)
- neighbors
- id=10としたら、id=9とid=11のデータを返す
Cookbookからのコピペだけど、これはかなり便利。
public function view($id = null) { $this->Post->id = $id; $this->set('post', $this->Post->read()); }
データ入力などの業務系のアプリを作るなら、素直にCakePHPのO/Rマッパーとadd()、edit()、delete()、routerで作ったほうが圧倒的に速い。工数を細かいチューニングに割けるようになる。ただしある程度習熟してたらの話。いきなりは無理。私も無理。だからこうやってまとめているのです。
詳しくはAPIのドキュメントにオプションが取りうるパラメータがリストアップされているのでチェック → Model - CakePHP API
$_GET、$_POSTはいずこへ?
直接、$_GETにアクセスすればもちろん取得できますが、フレームワーク使ってて、ちゃんとアクセス方法が用意されてるなら、そっち使ったほうが後々楽な事もある(んじゃないかな?)。ということで、CakePHPが用意したオブジェクト経由で$_GET、$_POSTにアクセスする。
// Controller内 // $this->request->dataにFormやURLの引数やらが入っている。 // $this->request->is() でHTTPメソッドの種類をチェックできる if($this->request->is("post")){ $this->Post->save($this->request->data); }
以上はフォームの入力データを手っ取り早くDBへ突っ込むコード。バリデーションはModelに書くのでControllerでは意識しない。
バリデーションは空白ダメとか○文字以上○文字以下とかから正規表現を使ったこじゃれたものや、独自の関数を通してガッツリバリデーションすることもできる。
以下、APIのドキュメントからコピペ(ページが長くてアンカーがなかったので)。
// 空白禁止 public $validate = array( 'name' => 'notEmpty' ); // アルファベットのみ(正規表現) public $validate = array( 'name' => '/^[a-z].+$/i' ); // 文字数チェック(5文字以上、25文字以下) public $validate = array( 'age' => array( 'rule' => array('between', 5, 25) ) ); // 独自のバリデーション関数を通す方法 public $validate = array( 'password' => array( 'rule' => array('customValidation') ) ); // バリデーション関数の定義 public function customValidation($data) { // $data will contain array('password' => 'value') if (isset($this->data[$this->alias]['password2'])) { return $this->data[$this->alias]['password2'] === current($data); } return true; }
見るに耐えるHTMLを目指す
CakePHPの標準CSSセットは割とできがいい。マージンの取り方が適当にやっても21世紀的な見た目になる。更にHTMLの見た目にもこだわるなら、あのサイトと同じ見た目になる事請け合いな、「Twitter Bootstrap」をオススメします。最近のBootStrapは高機能になってきて、JavaScriptやlessなんかも取り込んでだんだん大きくなってきている。よくわからない事も多々あるけれど、とりあえず使いたいという場合は、
git clone https://github.com/twitter/bootstrap.git cd bootstrap make bootstrap # コンパイルが終わったら cd bootstrap ll 合計 20 drwxrwxr-x 5 ystream ystream 4096 2012-08-16 15:48 ./ drwxr-xr-x 8 ystream ystream 4096 2012-08-16 15:48 ../ drwxrwxr-x 2 ystream ystream 4096 2012-08-16 15:48 css/ drwxrwxr-x 2 ystream ystream 4096 2012-08-16 15:48 img/ drwxrwxr-x 2 ystream ystream 4096 2012-08-16 15:48 js/
以上の3つのディレクトリの中のファイルをwebroot直下にある同名のディレクトリにコピーすれば完了です。
ちなみにコンパイルできなかった人はnodeをインストールしてから
npm install recess uglify-js jshint -g # -gオプション付きなのでsudoした方がいいかも
とすると、コンパイルに必要なツールが揃います。
いつからかnpmは同梱されるようになったんですねぇ。
さて、bootstrapを準備したら、CakePHPのLayoutディレクトリにあるdefault.ctpにbootstrap読み込み用のタグを追記する。
<?php echo $this->Html->css("bootstrap.min.css"); ?> // もしくは <?php echo $this->Html->css("bootstrap-responsive.min.css"); ?>
これで追加完了。CakePHPデフォルトのCSSと衝突する可能性もあるので、bootstrapの方が後に読み込むように調整する。
CakePHPのデフォルトCSSを読まないと、SQLクエリの実行結果表示が腐るので、邪魔している部分は別途CSSを用意してCakeデフォルトを上書きするか、潔くデフォルトを捨てるか。SQLの実行結果はテストで利用することもあるのでソースコードのテストが終わるまでは残して、本番では使わない、でいいと思います。適当にやってください。
URLにも凝りたい
CakePHPは例えばウェブ領域のサブディレクトリにシステムを置いたとしても、正しくURLを取得してくれるので、内部リンクの生成は、CakePHPに丸投げしていい。更にURLを簡便にしたい(example.com/post/add/ を example.com/addpost/ にする)場合はrouter.phpにURLの指定をすればいい。良い感じにまとまっている資料があるので、1.2系用のものだけれどチェックしてみてください。割とそのまま使えます。 → 極める routes.php (CakePHP 1.2)
後は詰まったら詰まった時に検索、もしくは初心に戻ってCookBook、もしくはAPI Documentでなんとか乗り切ってください。
PHPでなら書けるのに、CakePHPの機能を一生懸命探すのは、割と時間の無駄な時もある(特にDBのクエリなど)ので、フレームワークに頼らない書き方でケリをつけるのもアリだと思います。またリファクタリングする時が来るまでに勉強しておきましょうって感じでどうでしょう?
see also:
CakePHPの細かいTIPS Twitter Bootstrapとの絡みとか
コメント
コメントを投稿