ブログチュートリアルをやった「だけ」でのCakePHPの感想的な何か
とりあえずブログチュートリアルをさらっとやっただけで、そもそもよくわかってないのですが、個人的にCakePHPの気になるところをまとめる。
- ディレクトリ名の頭文字が大文字
- ORMで取得したレコードのデータ構造
- View側でのhelperの使い方
- Controller内のmodelクラス使い方
- flashの使い方
- viewファイルの拡張子
ディレクトリ名の頭文字が大文字
ディレクトリが
app/Controller
app/Model
app/View
のようにディレクトリ名の頭文字が大文字になっているのでタイピングの下手な僕としては細かいことですが、地味にイラッと来るw
小文字ではダメだったのだろうか。
ORMで取得したレコードのデータ構造
あまりに気になったのでマニュアルをちょっと深追いしたくらい気になったんだけど、findメソッドで取得できるデータ構造がちょっと使いにくい
たとえばfindByhogehogeなメソッドはfind('first')と戻り値が同じで1行だけのデータが取得できるらしいんだけど、取得できるデータが
Array ( [ModelName] => Array ( [id] => 1 [field1] => value1 [field2] => value2 [field3] => value3 ) )
という構造になっているらしい。モデル名をkeyにした連想配列とのことでrubyのActiveRecord感覚では大変使いづらい。実際使うときには
<?php $post = $this->Post->findById(1); // 本文を表示 echo $post['Post']['body'];
みたいに書かないといけないのが結構つらい。何がつらいって、書くのが大変で冗長であることと、連想配列なので、戻ってきたデータ構造に対してちょっとデータを加工したいときような処理をどこに書いていいかわからない。rubyのActiveRecordのインスタンスメソッドみたいに書きたい。
個人的な希望としては
- findでレコードを取得するときはモデルのオブジェクトで返してほしい。
- かつカラム情報はプロパティとしてセットされていて、__get,__set的なものでよろしくアクセスできるようになっててほしい。(__callを使ってgetBody()なんていうのもアリ)
ようは
<?php $post = $this->Post->findById(1); // 本文を表示(こんな風に書きたい) echo $post->body; // もしくはこんな感じ echo $post->getBody();
View側でのhelperの使い方
たとえばリンクを生成するときにHTMLヘルパーを使うのだけれど、
<?php echo $this->Html->link('Add Post', array('controller' => 'posts', 'action' => 'add')); ?>
と書くんだけれども、長い!$this->Html->link.... って長いよ!せめて$this->linkToとか$thisもなしにlinkToとかって書けないものか。ラップするようなヘルパーを書けばいいのだけれど、フレームワーク側でやってくれると嬉しかったりします。
Controller内のmodelクラス使い方
Controller内でmodelにアクセスするときに(※controller内に限った話かどうかはわからない)
<?php $posts = $this->Post->find...
みたいに書くらしいけど、そもそもどうして$thisからモデルオブジェクトを取得する仕組みなんだろうか。オブジェクトの生成はすべてコントローラーに寄せる的な発想なのだろうか?それともControllerのテストを書くときにmodelオブジェクトをmock化しやすくするためなのだろうか?まぁ何が言いたいかというと$this->を書くのが、めんどいのとcontroller以外でmodelを使いたいときにどう書いていいのかわからない。(まずは調べろよ俺)
flashの使い方
何かと便利なflashだけど、使うための設定がめんどいのとタイプが多い。
<?php // controllerのインスタンス変数に public $helpers = array(..., 'Session'); public $components = array(..., 'Session'); // controllerで使うときは $this->Session->setFlash('flash message.'); // viewで使うときは echo $this->Session->flash();
どうやらSessionHelper,SessionComponentはデフォルトで組み込まれいているようだけど、うっかり子クラスとかで上書きされちゃうかもしれないし、そもそも常に使えてもいいような機能な気がするので、わざわざ設定したくないし、なんていうかもっと手軽に使えてもいいんじゃなかろうか。$this->setFlash()とかとか
まとめ
- Railsを触ったことがある人ならなんとなく感覚はつかめやすい。
- ORMのところはちょっと... (そもそもCakePHPのORMは1レコード1オブジェクト的なActiveRecordパターンじゃないのかしら)
- 手軽にそれっぽいシステムが作れる
- テストの書き方とか調べておきたい。
- フルスタックなのでソースとか追いやすい感じ。
とりあえずチュートリアルとちょびっとマニュアルを見た程度で書いた感想でした。
わからないでウダウダ書いた感があるので、もう少し勉強します(猛省)