CakePHP2実践入門が増刷されました!

CakePHPをバリバリ使ってるエンジニアで書き上げた「CakePHP2実践入門」、おかげさまで増刷(第2刷)となりました!
CakePHPをある程度使ってる方にも有用で、例えばソーシャル連携とか、セキュリティとか、テストとか、CakeEmailとか、私もCakePHP2の開発をする上で手放せない本になりました。やはり現場で活躍している人が書いてると役立ちますね。
自分が書いたチートシートも自分の役に立ってて、がんばって書き上げてよかったなと思ってます。



http://www.amazon.co.jp/dp/4774153249/

CakePHP2.3がリリースされました。

CakePHP2.3がリリースされました。
http://bakery.cakephp.org/articles/lorenzo/2013/01/28/cakephp_2_3_0_is_out


マイグレーションガイドはこちら
http://book.cakephp.org/2.0/en/appendices/2-3-migration-guide.html


find('first')が0件だった場合の返り値が変わったとか、新原(@shin1x1)さんが作ったPHP5.4用サーバ起動cake shellとか、色々とあります。

ComposerでインストールしたPHPUnitをCakePHP2のコンソールから利用する方法

今回は、ComposerでインストールしたPHPUnitをCakePHP2から利用する方法です。

Composerのインストール方法は昨日書きました。
「Composerを使ってPHPUnitをインストール」


さて、方法はいろいろとあると思いますが、今回はCake2が元々持っているTestShellクラスを継承して対応します。


まずは、下記の場所にファイルを作成します。
app/Console/Command/MyTestShell.php

<?php

/**
 * ComposerインストールしたPHPUnitをロード
 **/
require_once APP . DS . 'Vendor' . DS . 'PHPUnit' . DS . 'autoload.php';


/**
 * オプション項目
 * Apache側で設定していた環境変数をshellで利用できるようにセット
 **/
// $_SERVER['DB_CONFIG'] = 'hogehoge';



App::uses('TestShell', 'Console/Command');
class MyTestShell extends TestShell {

}


そして、下記のコマンドで作成したシェルクラス(my_test)が実行できます

cd /yourpath/app
./Console/cake my_test app


毎回手で打つのは面倒なので、shellにエイリアスを登録しておくと便利です

alias my_test="cd /yourpath/app && ./Console/cake my_test app"

App::import('Model', 'モデル名')をCakePHP2用にApp::uses()使うように置換

テストケースなどでモデルの読み込みをApp::importでやっている箇所が大量にあったので、一括置換する方法

App::importの箇所を、自分のモデル名の文字列を切り出して、App::usesに置換します。

find ./ -name "*.php" | xargs sed -i "s/App::import('Model', \(.*\))/App::uses(\1, 'Model')/g"

Composerを使ってPHPUnitをインストール

PHPUnitpearなどで入れることも出来ますが、ほかのPearライブラリと同一フォルダにインストールされてしまうため管理しにくいし、チームの各自でPearインストールをしてもらうとバージョンも異なる可能性もあるので避けたい。
必要なファイルだけをGitで管理してチーム全体で共有するために、Composerを使ってインストールしてみました。


まずはインストールしたいディレクトリに移動

cd app/Vendor


そこに、composer.jsonというファイル名で下記の内容を記述

{
        "name": "phpunit",
                "description": "PHPUnit",
                "require": {
                        "phpunit/phpunit": "3.7.*"
                },
                "config": {
                        "vendor-dir": "PHPUnit"
                }
}

composerをダウンロード

wget http://getcomposer.org/composer.phar


そのディレクトリで、下記を実行するとインストール完了です

php composer.phar install

これで、app/Vendor/PHPUnitの中に必要なファイルがインストールされました。
それをgitで管理すれば良いだけ。


あとは、phpファイルの中で下記を読み込めば、phpunitが実行できるようになります(定数APPはCake独自のもの)

require_once APP . DS . 'Vendor' . DS . 'PHPUnit' . DS . 'autoload.php';

次回は、CakePHP2でこれを利用する方法を書きます。

Cake1からCake2に移行した際に、Call to a member function body() on a non-objectエラーが出る場合の対応

Cake1.2からCake2に乗せ換えしていてはまった話。
エラーログに下記のようなメッセージが出てうまく表示できない場合、コントローラのresponseオブジェクトが存在しないのが原因。$this->response->body()をCakeのコアコードで呼び出すのでその時にresuponseオブジェクトが無いからメソッド呼び出しエラーとなる。

Fatal Error (1): Call to a member function body() on a non-object


理由は、Controllerのコンストラクタを下記のように記述しているからでした。。。。

function __construct() {
	parent::__construct();
}


Cake2からはコンストラクタにrequest,responseオブジェクトが渡されるのでそれを考慮しないといけない

function __construct($request, $response) {
	parent::__construct($request, $response);
}

いやー、はまったわー。保守もしたことがないコードの載せ換え作業は大変ですねー