cakephp雑感とかtips~その1~
適当に思ったことを書く。
controllerはできる限りスリムにする。
controllerで$this->[MODEL_NAME]->findXXXとかサンプルやチュートリアルで書かれているもんだから、僕も多分にもれずそう書いてきたんだけど、これって良く考えたらビジネスロジックじゃん。こういうのはModelに書くだろJK。PK決めうちで抜き出しとかならcontrollerに記述してもいいと思うけど、DBに入れる入力値のフォーマットとか、何か似たようなSQL発行は、単純なものだとしてもなるべくmodel側に寄せる。これでcontrollerがスリムになるし、使い回しが効く。
共通化したい処理とか
コンポーネント作ってuseするか、Vendorにおけばいいと思う。
トランザクション管理とか
cakeのチュートリアルはsaveでINSERTやupdateしている処理があるにも関わらず、トランザクションに関するコードが一切出てこない。saveにしくったらrollbackとかもラップしてくれてfalseを返しているに違いない、と僕は思った。最初見たときはsaveメソッドで空気読んでいるんだな今時のフレームワークはナイスだなぁと思っていたんですが、cake-debugで吐き出されるSQLにトランザクション系のコマンドが無いことに気づき、「オウフwwww デフォルトはトランザクション管理サポートしてないwwww」とコーヒー吹いた。
で、基本的にこのやり方を使わせてもらっているが、まだまだ非効率な部分が大きい。
cakeのsaveメソッドでは、プライマリキーがセットされていればupdate句を発行し、入っていない場合はINSERT句を発行する。saveメソッドの中でcake/lib/model/datasource/dbo_source.phpというクラスのcreateとupdateメソッドを呼んでいるが、そこではオブジェクトや連想配列になったブツをSQLにパースしたものをexecuteしているだけなので注意が必要です。
モデル単位にbegin,rollback,commitメソッドをもつと「複数テーブルにまたがる処理を1つのトランザクションで管理する」ということが非効率になる。saveallだけではカバーしきれないこともあるし、アソシエーションに依存するのはちょっとださい。色々考えちゅう。
エラーハンドリングはしっかり考えたいなぁ。
hidden吐き出し
1つ1つ書いてたらバカバカしいので、こちらを参考にカスタマイズしている。base64でencodeして使うとなおよろしいかと。
メール送信
僕はCakeMail(phpmailerのラッパー)を使用させてもらっている。HTMLレイアウトを.ctp形式で書けるのは便利だけど、携帯に送る時どうしても遅延がおこったりする。他のサービスはサクっと返してくれるのに。なんでなんだろう?
あとはSession関連、認証関連。これは現在勉強中なのでまとまったらまた書きたい。
いじょ