CakePHPを真面目に使ってMVCについて思ったことと、おまけでSQLでの戻り値

途中からの改修とかでは無く、cakePHPを初めてがっつり使った開発を今週やりました。

実は、CakePHPは別の方が作った物の改修・修正や運用の引継ぎとかが多かったんです。

それがまたいろいろ問題が多かったので、苦手意識が少しあったのです。

でも、開き直った結果、結構いい感じに作れたので、ちょっと感想的なことを書いておきます。

今回はアプリ全体ではなくて、EC関連のパートを担当しました。

作ったのは、ショッピングカートとポイントと決済です。

いつもフレームワークで思うのはModelに何を実装するかと言うことです。

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

〜私的なMVC〜

■モデル

DBを含めた、データの処理ロジックの集合

■コントローラー

ユーザーの操作に応じたモデル操作のためのロジック

■ビュー

画面の構築と出力

なんですけど、多くのcakePHPの事例が下。

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

〜一般的なcakePHP〜
※たぶん、cake的にはこれが正解(私が買った入門本もたぶんそうなので)。

■モデル

DBの操作(継承した基本機能を利用)

■コントローラー

いろんなロジック全部

■ビュー

画面の構築と出力

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

あと、DBの取り回しに感じての違い

「私」
SQLはそのまま書く(断然速いし、率直にわかりやすい)

「一般」
SQLは書かずにDB操作もコントローラーからモデルを介す。

(私見)一般のやり方はfindに検索条件とか書くわけだから実質SQLをコントローラーに
書いてるのと同じだと思うのだけど・・・
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

とまあ、こんな感じで、
私はきっとマイノリティになると思いますが、
どうしても、後者は、

コントローラーのボリュームがすごいことになり、
実質DB操作(DBを書き換えを伴う処理)もコントローラーに入ってて、
モデルがスカスカ(バリデーションくらいしか書いてない)、
というのが多いわけです。

私が作ると、たぶんcakePHPのトレンドからは大きく外れてしまうのですが、
でも後者の書き方はやっぱり、あの忌まわしいPHPベタ書き時代のソースをみてる
ようなカオス感があって、厳しいなと思います。

今回、悩んだというか迷ったことがひとつあります。

それは、Webpay(クレジットカード決済)の処理をどこに入れるかと言うこと。

で、やっぱり私はモデルに入れたんですね。

コントローラーは「実のあることをしない」、実のあるメソッドはモデルにいれるべき、
と思っていまして、結局そうしました。

※実のあるとは、データの更新や能動的なデータ取得などアプリの状態変化を伴う処理みたいなイメージです。

その分モデルがでっかくなってしまったので、
モデルを小分けにしても良かったかな、とは反省しました。

データ書き換えとか読込、検索って処理は目的別にメソッドをモデル内につくって、
それをコントローラーから利用する。

やっぱり主流は後者なのかなあ〜
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

そんな感じで、自分流に使ってみた感じでは、なかなかいいじゃんCakePHPでした。
動作もそんなに遅く感じませんでしたし、ビヘイビアとかヘルパーとかいろいろ
抽象化に貢献してくれそうな機能がグッドです。他のフレームワークでも似たような
ものがありますが、cakephpはわかりやすい気がしました。

MVCがわかるプログラマーなら、初めてでも入門書1冊あれば、さくっと使える気がします。
ネットのドキュメントはある程度作り始めてから改めて読むと、理解し易かったですね。

PS.

CakePHPを使う方ってあまり直接SQL書く人少ないと思いますが、
はまったことをひとつ、おまけで。

「UPDATE INSERT DELETEの戻り値がわからん!」

最初、書込系は成功でarray()だと思い込んでたのですが、
たまに true が戻されて、ちょっとはまりました。

まとめると、たぶんこんな感じです(あいまいな記憶に基づいて書いてますので、真相は自分で調べて下さいね・・・)

「UPDATE」
更新できたら true SQLが通れば(変更無くても) array() 失敗 PDOExceptionで拾うので戻りは不明

「INSERT」
挿入できたら array()

「DELETE」
なぞ(検証中)。今回DELETE使わなかったので。

「INSERT ON ON DUPLICATE KEY UPDATE」
insert が array()で update時は true?

↑10/23/2015追記
うーん、違うかも知れない。。。

あと、

$this->query($sql,false);

の false しないと、SELECTの結果が最新にならない(キャッシュを読む)ことに
なかなか気づかず、1時間ちょっとはまりました。

カートインしたあとに再計算して、金額を再読み込みしても、
Updateの時間が古いし、金額は変わってないしで困りました。

でも、開発中は全然そんなこと起こらなかったのが不思議。
いつの間にか起こっていました。

別の方が開発してる初期設定かなにかをmasterブランチから
マージして、起こったのかも・・・。

時間あるときに、フレームワークののソースを読んでみないと、と思いました。