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 の parseParams メソッドでの条件分岐で、ルーティングが設定してあれば読んで更新するし、してなければ読まないようになっていました。ただコメントを読んでみるかぎりでは、ルーティングが設定されていたらそれを使い、されていなければ設定を読むということをしたいようでした?
CakePHP 1.3 から、自分のアプリケーションディレクトリ内に CakePHP のライブラリファイルを拡張するためのフォルダが用意されています。CakePHP 2 でもそれが使えるようなので、Dispacher クラスを拡張してその条件分岐を変更します。ついでに dispatch のタイミングで指定したRouter クラスを使用するように変更もしました。
github のコミット差分
これでデータベースやいつもの設定をしたら、きちんと画面が表示できました。
ということでインストールはこれで終わりです。しかしなんで 1.3.6 ?
CakePHP のルーティングの設定をしてアクションとコントローラを実装できるようにします。
AppDispatcher で任意のルータークラスを使えるようにしたけど、考えてみたらいらないのでさっくり消しました。無駄骨。
Router クラスには mapResources という REST なルーティングを簡易に設定できる静的メソッドがあります。これがあんまり好きじゃなくて。というのも、こちらでの設定があまり引き渡せないし、プリフィクスルーティングが設定できない。できないはず。なので AppRouter クラスで、これをある程度できるようにした mapResources メソッドを定義して実装しました。 ごすっと設定渡せるようにしたのであんまりがりごり使うとたぶん不具合でそうですけど、自分で作ったこの追加にそんなに期待してないので大丈夫。
github のコミット差分
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 さんです。よろしくおねがいします。