Qbilinux 日記

Linux に関係することだけではなく,最近は一般的なコンピュータやガジェット関係についても記載してます.

cakephp 2.x から 3.0 への移行作業

手元のコードを移行させている作業について少し書いてみます.

php 用の web フレームワーク cakephp ですが,3.0.x が少し前にリリースされました.これまでの 2.x とは異なり,新しい ORM になったためかなり記述が変更になっています.変換ツールもありますが,ちょっと気持ちが悪い部分もあるので全面書き換え作業にしようかなと.

まぁ,コードを見直す良い機会になるかなというのもあってぼちぼちと作業をやってます.

結構はまるところもあるので,気になった点をメモ程度に残しておきます.

  • cakephp を composer で管理するようになった.composer.json に記載して composer update で cakephp や plugin 周りのインストール・アップデートができるようになったので便利.
  • salt の記述方法とかがこれまでと変わった?ユーザー認証パスワードとかをこれまでと同じ物を使うにはどうすれば良いんだろう?ちょっと調べるのは後回しー.パスワードは全部新規に登録し直す方が良い?
  • query 記述が基本的に全面変更になっている.
    • 一部,これまでの記述でも通るけど,find()->where()->contain()->select()->all() な感じの記述に変更.find('first') は ->first() に,find('count') は ->couont() を使う.find() で戻ってくるのは基本的に query object なので,それをどうしたいかを書かないと駄目.なので,find() を直接 foreach するとエラーになります.
    • これまでの conditions は where,recursive は contain.
    • recursive の代わりに明示的に contain で管理するようになったのはちょっと良いかもな.これまで細かいところをやろうとすると bind とか unbind して調整するか,query を直接記載する感じ感じだったので.->join(['type' => 'LEFT']) とか ->leftJoin(), ->rightJoin(), ->innerJoin(), ->distinct() などの method もあるので細かいことも指定できる.でも,やっぱり直接 query を書いた方が良いのかなぁ?
    • これまでと find() で戻ってくる配列が微妙に異なっている.$res = $this->Hoge->find() すると $res['Hoge'] 以下に値が入っていましたが,$res 以下に値が入っている形になっている.仕様変更?これまでと同じ形で戻ってくるようにする方法はあるのかな?
  • Model が Table と Entity に分離.
  • Form で boolean などは良きに計らってくれていましたが,type 指定が必要になったみたい.
  • Plugin が...あんまりない.個人的に,いくつか Plugin を使っていましたが,3.0 対応されていないものがほとんど.仕方ないので自分で書き換え作業するかもしくは Plugin を使わない方法に書き換えています.ちょっと辛いかな.安易に Plugin 使うのもどうかなぁと.元々,気になっていたのですが,とりあえず時間を短縮するために Plugin を使う形で書いておいて,あとで時間のあるときに Plugin に依存しないように修正しようと思っていましたが,作業時期が早まってしましました.^^;
    • app/Model -> src/Model/Entity, src/Model/Table
    • app/Controller -> src/Controller
    • app/View -> src/Template
    • lib 以下にあった cakephp 本体は vendor/cakephp/cakephp 以下に.
  • 日付の表示方法が変更?Template で普通に echo すると month/day/year time AM|PM 表記になる.この表記以外が嫌な場合は記述表記が必要みたい.
  • model の virtualfields がなくなったみたい.代わりに Entity 中に

class User extends Entity
{
    protected function _getFullName()
    {
        return $this->first_name . ' ' . $this->last_name;
    }
}

とか記述すれば $user['full_name'] でアクセスできる.

  • upgrade ツールはあるけど....https://github.com/cakephp/upgrade がありますが,あんまりドキュメントを読まずに既存ディレクトリに対して実行したところ,全部直接書き換えられた&ファイル移動されてしまいました.使う場合には注意を.個人的には出力ファイルを参考程度に使っている程度.

あんまりまじめにドキュメント読んでなくて,ざっと読みながら適当に作業しているだけなので間違っている箇所などありましたら申し訳ありません.勘違いしている部分もあるかもしれないですが,そのあたりはご容赦ください.

以上,参考まで.