読者です 読者をやめる 読者になる 読者になる

It's raining cats and dogs.

無駄なことなんてないはず

ブログチュートリアルをやった「だけ」でのCakePHPの感想的な何か

PHP 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にした連想配列とのことでrubyActiveRecord感覚では大変使いづらい。実際使うときには

<?php
$post = $this->Post->findById(1);
// 本文を表示
echo $post['Post']['body'];

みたいに書かないといけないのが結構つらい。何がつらいって、書くのが大変で冗長であることと、連想配列なので、戻ってきたデータ構造に対してちょっとデータを加工したいときような処理をどこに書いていいかわからない。rubyActiveRecordインスタンスメソッドみたいに書きたい。
個人的な希望としては

  1. findでレコードを取得するときはモデルのオブジェクトで返してほしい。
  2. かつカラム情報はプロパティとしてセットされていて、__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()とかとか

viewファイルの拡張子

.ctpって何かの略称だんだろうか?慣れなさすぎる。書き方は素のphpみたいなもんだから.phpで良かったんではなかろうか・・・

まとめ

  • Railsを触ったことがある人ならなんとなく感覚はつかめやすい。
  • ORMのところはちょっと... (そもそもCakePHPのORMは1レコード1オブジェクト的なActiveRecordパターンじゃないのかしら)
  • 手軽にそれっぽいシステムが作れる
  • テストの書き方とか調べておきたい。
  • フルスタックなのでソースとか追いやすい感じ。

とりあえずチュートリアルとちょびっとマニュアルを見た程度で書いた感想でした。
わからないでウダウダ書いた感があるので、もう少し勉強します(猛省)