CakePHP2 でアプリを作ってみて気づいたCakephp1.3系との違い
最近ソーシャルゲームはやってないですけど、iPhone ゲームの「僕の魔界を救ってにはまっているtanakaです。
最近CakePHP2で個人的に使うアプリを作っていて、1.x系との違いがいくつかわかってきたので、今日はそれを紹介します。
404 Not Foundなどのエラーレスポンスを本物の例外を使って出力するようになった
404や500などのエラー出力には今までController::cakeError() を使っていましたが、 2.0からはPHPの例外機構を使うようになりました。 CakePHP 1.x 系で例外を使っていないのは、1.x系ではPHP4をサポートしており、PHP4では 例外機構がなかったからでしょう。
一般的な使い勝手はそう変わらないです。
Before
<?php
// アクションメソッドの中で
$this->cakeError('error404');
After
<?php
// アクションメソッドの中で
throw new NotFoundException();
発行させたいエラーがそのまま例外クラス名になっていて、わかりやすくなったと思います。
CakeRequest オブジェクト
1.x系では、アクセスされたURLについては Controller::params, フォームからPOSTされた情報は Controller::data, HTTPメソッドがPOSTかGETなのか、はRequestHandlerComponent を使って判断していましたが、これらはすべてCakeRequestオブジェクト( Controller::request でアクセスできます )に集約されることになりました。
たとえば、ルーティングで次のように設定されていたとします
<?php
// app/Config/routes.php
Router::connect('/my_calendar/:year',
array('controller'=>'my_calendar', 'action'=>'year'),
array('year'=>'[0-9]{4}')
);
このとき、 ブラウザで /my_calendar/2011 にアクセスすると、 $this->request の中身は次のようになります。
CakeRequest Object
(
[params] => Array
(
[plugin] =>
[controller] => my_calendar
[action] => year
[year] => 2011
[named] => Array
(
)
[pass] => Array
(
)
)
[data] => Array
(
)
[query] => Array
(
)
[url] => my_calendar/2011
[base] =>
[webroot] => /
[here] => /my_calendar/2011
....
ちょっとタイプ量が増えますが、使い勝手はあまりかわらないと思います。HTTPメソッドがGETかどうか判定するコードは
$this->RequestHandler->isGet();
から
$this->request->is('get');
になります。
ディレクトリ、ファイルの命名規則
いままではディレクトリ名、ファイル名は小文字・アンダースコアのみで構成されていました
- controllers, models, views
- home_controller.php, my_page_controller.php
これらは、ビューテンプレート以外ほとんど変更されています。
- Controller, Model, View(ディレクトリ)
- HomeController.php, MyPageController.php
まとめ
いま、CakePHP2で個人的なツールを作っていて(公開するようなツールではないです…)1週間くらいで感じた、大きな違いを3つピックアップしました。基本的に、CakePHP1.3 , 1.2 のユーザーであれば、すんなりと使えるようになると思います。