« [Webサービス]ウォーキングやジョギングした道の距離を測ってくれるWebサービス~キョリ測~ | メイン | [Webサービス]名前を入れるだけで性格がわかっちゃう ~性格メーカー~»

[cakePHP]コマンドラインスクリプトで半日ハマったエラーの解決

| | コメント(0) | トラックバック(0)
こんばんは、 CHORD Fusion高橋純平です。

今日は技術的な備忘録としてのエントリーなのでご了承ください m(_ _)m

ここ(http://tempdocs.cakephp.org/)を参考にしながらcakephp 1.2 でコマンドラインスクリプトを作成。

【Shellプログラム】
/app/vendors/shells/insert.php

【Taskプログラム】
/app/vendors/shells/tasks/record.php

メールを受信したら insert.php を実行して、本文の内容をDBに保存(record.phpで実行)するという流れ。

テストとしてcake.phpをコマンドライン上で実行
/cake/console/cake insert record 2 2008-01-02

引数の1つ目がIDになっていて、既存のレコードがなければ新規登録 / あれば上書き保存という仕組み。

新規登録の場合はうまくいくのだが、上書き保存のときに以下のエラーが出て行き詰った。。。

PHP Fatal error:  Undefined class name 'string' in /home/****/cake/libs/model/datasources/dbo_source.php on line 1456

Fatal error: Undefined class name 'string' in /home/****/cake/libs/model/datasources/dbo_source.php on line 1456


dbo_source.phpを見てみると、fieldsという関数の中で呼んでいる String::tokenize()メソッドが認識されていないようだということが分かった。

function fields(&$model, $alias = null, $fields = array(), $quote = true) {
                if (empty($alias)) {
                        $alias = $model->alias;
                }
                if (empty($fields)) {
                        $fields = array_keys($model->schema());
                } elseif (!is_array($fields)) {
                        $fields = String::tokenize($fields);
                } else {
                        $fields = array_filter($fields);
                }


【原因】
tokenize()メソッドは /cake/libs/string.php 内で定義されているメソッドなので、string.phpをincludeできていないのが原因だった。

【解決方法】
/cake/console/cake.php__bootstrap()メソッドのincludes に string.php を加える

 function __bootstrap() {

                define('ROOT', $this->params['root']);
                define('APP_DIR', $this->params['app']);
                define('APP_PATH', ROOT . DS . APP_DIR . DS);
                define('WWW_ROOT', 'webroot');

                $includes = array(
                        CORE_PATH . 'cake' . DS . 'basics.php',
                        CORE_PATH . 'cake' . DS . 'config' . DS . 'paths.php',
                        CORE_PATH . 'cake' . DS . 'libs' . DS . 'object.php',
                        CORE_PATH . 'cake' . DS . 'libs' . DS . 'inflector.php',
                        CORE_PATH . 'cake' . DS . 'libs' . DS . 'configure.php',
                        CORE_PATH . 'cake' . DS . 'libs' . DS . 'cache.php',
                        CORE_PATH . 'cake' . DS . 'libs' . DS . 'string.php'
                );

日本語で検索しても出てこなかったのだが、google groupsで投げかけている人がいたので助かった。
http://groups.google.co.jp/group/cake-php/msg/e136897070cae911

以下がfix済みのチケット。cake.phpのincludeにstring.phpを含めばよいと書いてある。
https://trac.cakephp.org/ticket/3793
https://trac.cakephp.org/changeset/6312


オープンソースのものを使っていて壁にぶち当たったとき、大抵他の人が先にぶち当たっていたりするので、出てきたエラーで探すと早いですね。

ただ、新しいものであればあるほど日本語での情報は少ないので、積極的に英語を学ぶと共に、日本の仲間への情報共有もしていきたいです。

今回のエントリーも、今後同じエラーに悩む人がいたときの手助けになればうれしいです(^^)
(cakephp1.2がstableとしてリリースされるときには修正されているでしょうけどw)



トラックバック(0)

このブログ記事を参照しているブログ一覧: [cakePHP]コマンドラインスクリプトで半日ハマったエラーの解決

このブログ記事に対するトラックバックURL: http://chord-fusion.com/cgi-bin/blog/mt-tb.cgi/27

コメントする

track feed