はじめに
こんにちは。
現在複数案件を抱えておりまして、かつ、プライベートもとても忙しく、状況で若干疲弊気味です。。。
今回は現在お世話になっている案件のcakephpのバージョンアップを行いました。
長期間運用中のサービスのため、若干辛めなコードが点在しており、FWのバージョンアップには、若干消極的ぎみだったのですが、重い腰を上げてバージョンアップしました。
マイナーバージョンのバージョンアップですけどね...w
今回は3系の最新バージョンである 3.10.1
にあげることにしました。
ちなみに現在のバージョンは以下のとおりです。
$ ./bin/cake version 3.6.15
本題
基本的に問題なく動きました。
ただ、一点、バージョン 3.7
にあった以下の振る舞いの変更に引っかかりました。
Cake\Database\Type\IntegerType は SQL を生成しデータベースの結果を PHP の型に変換するときに 値が数値ではない場合に例外を発生させるようになります。
database的にリレーション制約をつけていないけど、cake側でリレーション関係を表しているような場合、join後nullになるようなパターンがあったりします。
たとえば、area_id というカラムには area.idが入るのですが、使われない場合に0に登録しておくみたいな感じです。
バッドパターンではありますが、何箇所かそのような部分があります。
このような場合、文字列の null
が来るようになり、上記の is_numericに引っかかりエラーになりました。
3.6以前は 下記のように is_scalar
でチェックしていたため問題なかったようです
こちらは、OldIntegerTypeを作り、各カラムのタイプを変更しました。
<?php namespace App\Model\Type; use Cake\Database\Type\IntegerType; class OldIntegerType extends IntegerType { protected function checkNumeric($value) { if (!is_scalar($value)) { throw new \InvalidArgumentException(sprintf( 'Cannot convert value of type `%s` to integer', getTypeName($value) )); } } }
これだけで動くようになりました。
ドキュメント見る限りは破壊的な変更は特になく、その他の緩やかな変更も問題ありませんでした。
終わりに
今回はPHPのちょっとした記事になりました。
ちょっとプライベートが忙しすぎてアドベントカレンダーをキャンセルするという悪行をしてしまいました。。。 まじで反省しています。
現場からは以上です。