CakePHP 1.3 系から 2.0 系にアップグレードする際の作業と注意点まとめ

中身を少し見てみたところ、かなり色々と仕様が変わっています。ファイル名がキャメルケースになっていたり、独自シェルのファイルの配置が変わっていたります。そのため CakePHP 1.3 のファイル全てを CakePHP 2.0 に一新して、オリジナルのファイルを適用することにします。適用する際に注意することがありましたので、その注意点を以下にまとめます。

設定ファイルは新しいものを使いましょう

database.php や bootstrap.php や routes.php を見ただけでも変更点がありました。そのためファイルをそのまま移行するのではなく、これらのファイルに既存の設定を手作業で反映しなおすようにします。

ヘルパーの使い方が変更されました

今までは以下のようにヘルパーを使うことができました。

1
<?php $html->nestedList($recent); ?>

しかし、2.0 では以下のようにしなければヘルパーを使うことができませんので、上記のような書き方をしていた場合は全て書き直します。

1
<?php echo $this->Html->nestedList($recent)); ?>

フォームヘルパーなども以下のように書きます。

1
<?php echo $this->Form->end(); ?>

ファイル名はキャメルケースに書き直します

ファイル名はキャメルケースになります。コントローラーが Tests だった際コントローラーのファイルは tests_controller.php でしたが CakePHP 2.0 からは TestsController.php と書きます。要は class 名と同じようにファイル名を設定します。全てのファイル名を書き換える必要があります。

独自シェルファイルの配置とファイル名が変更

今までは app/vendors/shells/ 以下に配置していたものが、CakePHP 2.0 からは Console/Command 以下に変更になります。こちらのファイル名もキャメルケースに変更します。

追記: 作業ミスでシェルファイルの名称が CakePHP 1.3 系の時のままになっていましたが、なぜか開発用環境だとこれで動作していました。しかし本番環境ではこれでは動作せず、CakePHP 2.0 系に合わせて変更したところ動作しました。環境との兼ね合いを調査して、分かったことがあればさらに追記します。

以下のページが参考になりました。

データベースから取り出した配列キーが小文字になる

ClassRegistry::init() を使用してモデルを使う場合の挙動が変わりました。例えば Test モデルがある場合において、以下のようにデータを取り出すと。

1
2
3
$modelTest = ClassRegistry::init('Test');
$data = $modelTest->find('all', Array('conditions' => $params));
pr($data);

以下のように取り出せましたが。

1
2
3
4
5
6
7
8
Array
(
    [Test] => Array
        (
            [id] => 1
            [created] => 2011-10-21 16:25:59
        )
)

CakePHP 2.0 からは以下のようになりました。

1
2
3
4
5
6
7
8
Array
(
    [test] => Array
        (
            [id] => 1
            [created] => 2011-10-21 16:25:59
        )
)

キャッシュを取るなどの目的があり、エレメントなどから独立させてデータベースからデータを取り出している場合は、この文字列を小文字にする必要があるので注意しましょう。

追記: サーバー移転をしたところ小文字ではなく大文字になりました。サーバーによるようです。ヘテムルだと小文字、開発用 Ubuntu だと小文字、本番 CentOS だと大文字で、環境との兼ね合いをもうしばらく見てみますので、この項目は未確定ということで。

ただ、そもそもビューから起動するのは邪道なのでしょうか。今のところは普通は大文字、環境によって小文字になることを想定してその分だけモデル側で対応できるように実装しています。

MySQL エラーが発生するようになりました

以下のようなエラーが発生するようになりました。

1
Access denied for user 'www-data'@'localhost' (using password: NO)

これについては以下のように権限を与えて解決できます。

1
2
use infomation_schema;
GRANT USAGE ON *.* TO 'www-data'@'localhost';

以下の記事が参考になりました。

追記: Mode->save() 関数の挙動が変わりました

レコードの新規作成。

1
2
$this->Recipe->create();
$this->Recipe->save($this->data);

レコードの上書き。

1
2
$this->Recipe->id = 2;
$this->Recipe->save($this->data);

追記: Auth コンポーネントで入る Session の値

昔はレコードの値が丸ごと入ってたきがしますが、今はこのようになっています。この変更に対応するようコードを書き換える必要がありそうです。

1
2
3
4
5
6
7
8
9
Array
(
    [User] => Array
        (
            [username] => hoge
            [password] => hash
        )
 
)

追記: HttpSocket を使えるようにする

CakePHP 2.0 から HttpSocket などを使う方法が変更になっています。以下のように読み込みますので、使っている場合は変更します。

1
App::uses('HttpSocket', 'Network/Http');

参考サイト

他にも移行記事を書いているブログがあります。新しく書いた人は連絡を頂ければこちらに追記させて頂きます。今は情報が少ないのでみんなで作っていきましょう。

コメント

  1. hiromiさんのコメント

    >データベースから取り出した配列キーが小文字になる
    面白い(開発者としては面白くないですが)現象ですね。
    環境依存のバグだと思うのでバグ報告したほうがいいと思います。

    • webleさんのコメント

      ちょうど新しい開発環境を作っていますのでこちらでもテストしています。あっただけでは難なので、バージョン揃えて報告しますね。