CakePHP2実践入門が増刷されました!
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をインストール
PHPUnitはpearなどで入れることも出来ますが、ほかの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でこれを利用する方法を書きます。
メモ: プロジェクト内のphpファイルのシンタクスチェックを一括で行う方法
find . -type f -name "*.php" -exec php -l {} \;
ctpファイルの場合
cd View find . -type f -name "*.ctp" -exec php -l {} \;
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); }
いやー、はまったわー。保守もしたことがないコードの載せ換え作業は大変ですねー