Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

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関連、認証関連。これは現在勉強中なのでまとまったらまた書きたい。

いじょ