[Codeigniter] APIファーストで見渡しのいいコード設計

CRUD系処理をするControllerって、見通し悪くないですか??
まず、たくさんのvalidationルールがあって、次にvalidation後の分岐があり、何だったらmodelを呼び出してデータ処理をかけ、そして最後にview関係の処理をする。
もちろん、設計がどうの、modelにもっとちゃんと任せろよ、libraryを活用しないと!と思いつつも、気づいたらcontrollerの1メソッドが100行を超えてたりして。恐怖。
 
これを何とかできないかと試行錯誤していたら、辿り着いたのがAPIファーストで、それが案外に作りやすく、コードの見通しもいいのでご紹介です。

form method=”POST”を捨てよう

敵は、method=”POST”でした。
POSTしたあとの画面で、リロードすると「情報を再送信します」とかいうあの恐怖の仕様。POSTしたものをhtmlspecialcharsにかけて、再度表示した上で、「更新できました」とだすのがメジャーでしたが、いつまでこの仕様と付き合っていくのか。
苦肉の柵で、再表示をやめてredirectをかけたりするのですが、なんかイケてないですよね・・・。
 
でも、method=”POST”を捨てて、ajax通信をすると一気に問題が解決されました。
 
1.ajaxだと画面遷移がないから、再表示する必要がない!
画面遷移をするから、入力した文字を再表示しないといけないのです。動的にformに入力する値を取得して、別URLに投げて、その結果を拾ってくるajaxだと、if地獄で表示を変える必要がそもそもなくなる!
 
2.ajaxだと、validationを別のControllerに書ける!
ajaxでデータ送信をすると、validationとその後の処理を別controllerに投げることになるので、ユーザがアクセスするControllerは表示のみのシンプルな構成になります。結果、めっちゃ表示に関する部分の見通しがよくなった。
 
3.validationばかりのcontrollerができるので、validationのルールチェックが安易に
4.リロードしても、情報は再送信されない
 
 

フォルダ構成

これは、POSTを捨てるしかない!と、その前提でCodeigniterを設計しようとすると、ユーザにアクセスさせるURL構造を踏まえたControllerと、CRUDのためにajaxでアクセスする前提のController群に分かれます。具体的には以下な感じ。

application/
└── controllers/
  ├── Welcome.phpとか
  ├── Auth.phpとか
  ├── ユーザがアクセスするコントローラー群
  └── resources/
     ├── Welcome.php(controllers/Welcome.php に対応したCRUD)
     └── Auth.php(controllers/Auth.php に対応したCRUD)

resourcesというフォルダをつくって、ユーザ用のControllerに対応したCRUD用のControllerを用意しています。
で、そこのControllerは、validationして、処理をして、結果をjsonで返すというjson発行機状態に。
 
で、ふと気づくと「あれ、これってAPIファーストの設計とほぼ共通してるんじゃないか」と気づいたのが先週ぐらいの出来事でしたw
 

まとめ

もちろんのことなのですが、これってajaxを使わないとできないので、最低でもjQuery、できればangularjs程度のjsフレームワーク周りを多少理解していないとできないことです。
「いやいや、そこまでするなら、view周りもtemplate化してしまって、jsフレームワークでURLルーティングふくめて全部設計しろよ」というつっこみももちろんなのですが、そこにたどり着く技術習得コストと、移行コストを考えると、「今までのやり方の延長線上でスマートにAPIファーストを設計」というのが現実的じゃないのかなと思っております。
PHPで表示するし、PHPで処理するのに、APIファースト。コードの見渡しもいいし、開発も楽なので、ぜひお試しください。
 
それでは、また。

お問い合わせ