Skip to content

Instantly share code, notes, and snippets.

@aerith
Created December 16, 2010 04:15
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aerith/743016 to your computer and use it in GitHub Desktop.
Save aerith/743016 to your computer and use it in GitHub Desktop.
gist という日記サービス

CakePHP2.0 を触ってみて。

2 の 4 乗の 16 日なので、CakePHP2.0 にすこし触れてみました。こじつけです。

ほんとうはもうすこしいろいろとやってみたかったんですが、忙しくてものすごく中途半端になってしまいました。穴があったら入りたい。

基本的なところはそれほどかわっていませんが、やっぱりまだまだこなれていない感じがありました。 今回使用したのは 2010 年 12 月 前半のあたりのもので、今もブランチが増えてたりしたので、今も開発は進んでいるところだと思います。 CakePHP2.0の概要(訳) で紹介されているものも、すでにいくつか実装されていたようです。

とりあえず導入

Apache の設定をしたあとに CakePHP をダウンロードして配置します。

以下の工程では /hoge/blog.sakura.aerith.sc/app/webroot をドキュメントルートに設定しています。
それぞれに合わせて設定してください。使用した OS は Ubuntu 10.04.1 LTS です。

コマンドラインでファイルを取得してインストール

$ mkdir blog.sakura.aerith.sc
$ cd blog.sakura.aerith.sc/
$ wget https://github.com/cakephp/cakephp/tarball/2.0 --no-check-certificate
$ mv 2.0 cakephp-2.0.0.tar.gz
$ tar xvzf cakephp-2.0.0.tar.gz
$ cp -r cakephp-cakephp-aa0bad9/* ./
$ rm -fr cakephp-cakephp-aa0bad9/

テンポラリディレクトリへのパーミッションの設定

app/tmp ディレクトリに書き込み権限を与えます。

$ find app/tmp -type d -exec chmod 0777 {} \;

アクセスして確認をします。

なぜかいつもの初期画面が表示されていません。

あらあら、Dispatcher さん?

これはDispatcher の parseParams メソッドでの条件分岐で、ルーティングが設定してあれば読んで更新するし、してなければ読まないようになっていました。ただコメントを読んでみるかぎりでは、ルーティングが設定されていたらそれを使い、されていなければ設定を読むということをしたいようでした?

ライブラリディレクトリに自作のライブラリを追加

CakePHP 1.3 から、自分のアプリケーションディレクトリ内に CakePHP のライブラリファイルを拡張するためのフォルダが用意されています。CakePHP 2 でもそれが使えるようなので、Dispacher クラスを拡張してその条件分岐を変更します。ついでに dispatch のタイミングで指定したRouter クラスを使用するように変更もしました。
github のコミット差分

これでデータベースやいつもの設定をしたら、きちんと画面が表示できました。

ということでインストールはこれで終わりです。しかしなんで 1.3.6 ?

ルーティングの設定

CakePHP のルーティングの設定をしてアクションとコントローラを実装できるようにします。

さっき作ったやつ

AppDispatcher で任意のルータークラスを使えるようにしたけど、考えてみたらいらないのでさっくり消しました。無駄骨。

Router クラスには mapResources という REST なルーティングを簡易に設定できる静的メソッドがあります。これがあんまり好きじゃなくて。というのも、こちらでの設定があまり引き渡せないし、プリフィクスルーティングが設定できない。できないはず。なので AppRouter クラスで、これをある程度できるようにした mapResources メソッドを定義して実装しました。 ごすっと設定渡せるようにしたのであんまりがりごり使うとたぶん不具合でそうですけど、自分で作ったこの追加にそんなに期待してないので大丈夫。
github のコミット差分

おまけで PHPUnit の取得

CakePHP2 からテストフレームワークが simpletest から PHPUnit に変更されました。ファイルを取得して、ルートディレクトリの vendors 以下に配置します。

cd ./vendors
mkdir -p /tmp/install_phpunit ; \
wget --no-check-certificate https://github.com/sebastianbergmann/phpunit/tarball/3.5.5 -O /tmp/install_phpunit/phpunit.tgz ; \
wget --no-check-certificate https://github.com/sebastianbergmann/phpunit-mock-objects/tarball/1.0.3 -O /tmp/install_phpunit/mock_objects.tgz ; \
wget --no-check-certificate https://github.com/sebastianbergmann/php-code-coverage/tarball/1.0.2 -O /tmp/install_phpunit/code_coverage.tgz ; \
wget --no-check-certificate https://github.com/sebastianbergmann/php-token-stream/tarball/1.0.1 -O /tmp/install_phpunit/token_stream.tgz ; \
wget --no-check-certificate https://github.com/sebastianbergmann/php-timer/tarball/1.0.0 -O /tmp/install_phpunit/timer.tgz ; \
wget --no-check-certificate https://github.com/sebastianbergmann/php-file-iterator/tarball/1.2.3 -O /tmp/install_phpunit/file_iterator.tgz ; \
wget --no-check-certificate https://github.com/sebastianbergmann/php-text-template/tarball/1.0.0 -O /tmp/install_phpunit/text_template.tgz
tar zxvf /tmp/install_phpunit/phpunit.tgz -C /tmp/install_phpunit/ ; \
tar zxvf /tmp/install_phpunit/mock_objects.tgz -C /tmp/install_phpunit/ ; \
tar zxvf /tmp/install_phpunit/code_coverage.tgz -C /tmp/install_phpunit/ ; \
tar zxvf /tmp/install_phpunit/token_stream.tgz -C /tmp/install_phpunit/ ; \
tar zxvf /tmp/install_phpunit/timer.tgz -C /tmp/install_phpunit/ ; \
tar zxvf /tmp/install_phpunit/file_iterator.tgz -C /tmp/install_phpunit/ ; \
tar zxvf /tmp/install_phpunit/text_template.tgz -C /tmp/install_phpunit/ ; \
cp -fr /tmp/install_phpunit/sebastianbergmann-phpunit-9243529/PHPUnit ./ ; \
cp -fr /tmp/install_phpunit/sebastianbergmann-phpunit-mock-objects-3f46dd2/PHPUnit/* ./PHPUnit/ ; \
cp -fr /tmp/install_phpunit/sebastianbergmann-php-code-coverage-c45df64/PHP ./ ; \
cp -fr /tmp/install_phpunit/sebastianbergmann-php-token-stream-9d3c637/PHP/* ./PHP/ ; \
cp -fr /tmp/install_phpunit/sebastianbergmann-php-timer-683d142/PHP/* ./PHP/ ; \
cp -fr /tmp/install_phpunit/sebastianbergmann-php-file-iterator-67c4399/File ./ ; \
cp -fr /tmp/install_phpunit/sebastianbergmann-php-text-template-c6d79d7/Text ./
rm -fr /tmp/install_phpunit

test.php にアクセスするとコアライブラリのテスト一覧がずらっと表示されます。

データの送信、取得

フォームで送信された値やクエリストリングの値は、だいたいコントローラのプロパティを参照していたのが、request プロパティ、中身は CakeRequest のオブジェクト、のプロパティを参照するようになっています。response も CakeResponse クラスのオブジェクトを保持してましたけどよく見てません。

オブジェクトの遅延ロードと初期化

新しく cake/libs 内に object_collection.php というファイルがあり、ヘルパーやコンポーネント、ビヘイビアそれぞれにそれを継承したクラスができています。中身をみたところ、名前のまんまそれぞれの集合を保持して、呼ばれたときのオブジェクトを生成して、という流れを行うクラスのようです。いろいろと試してみてダメだったので、実際にソースを追ってみたところやっぱりまだエイリアスあたりは実装されてないみたいでした。たぶんこのクラスでやるんだと思うんですけど。

$ grep -nir 'extends ObjectCollection' cake
// => cake/libs/view/helper_collection.php:21:class HelperCollection extends ObjectCollection {
// => cake/libs/controller/component_collection.php:21:class ComponentCollection extends ObjectCollection {
// => cake/libs/model/behavior_collection.php:32:class BehaviorCollection extends ObjectCollection {
// => cake/console/libs/task_collection.php:21:class TaskCollection extends ObjectCollection {

上手に焼けました!

そんなことはなかった。時間がなかったのでここから唐突に雑感の書きなぐりです。あまりバージョン関係ないです。

そのいち

core.php を触っていて少し気になったのが、Session の設定を配列で行うようになっていて、name を CAKEPHP に指定しているところが消えてしまっていたこと。
コメントでデフォルトの値はこうだよっていうのが書いてありますが、あからさまに設定してあるのが目に見えるほうが注意して変更するような気がします。気をつけないと忘れそう。

そのに

Form ヘルパーが編集だと思われる場合(中身読んでないけどたぶん、$this→data の処理するモデルの id が入っていた場合)、
0 を添え字に勝手に id を渡してしまい URL がおかしくなります。この補完はだいぶ余計なお世話だと思うんですけど、継承したクラスを使ったりしてうまいことしてたりするのでしょうか。

そのさん

ていうか Form ヘルパーさんは勝手に余計な div いれないでほしい。今のところ入るメリットよりもデメリットばかりを感じてしまいます。割と毎回消します。

そのよん

もっと cakephper さんの Cake plus みたいなのをみんなで公開できたらおもしろいのかなーと常日頃から思ってますが当の自分がやってません。

そのご

この小学生でも作らないようなメモ書きアプリ、こんど作り直します…。

まとめ

使ってみたのはいいけど、やっぱりもうすこし開発が進むのを待ちましょう。

次は nojimage さんです。よろしくおねがいします。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment