もがき系プログラマの日常
もがき系プログラマの日常

もがき系プログラマの日常

はじめに

こんにちは。

現在複数案件を抱えておりまして、かつ、プライベートもとても忙しく、状況で若干疲弊気味です。。。

今回は現在お世話になっている案件のcakephpのバージョンアップを行いました。

長期間運用中のサービスのため、若干辛めなコードが点在しており、FWのバージョンアップには、若干消極的ぎみだったのですが、重い腰を上げてバージョンアップしました。

マイナーバージョンのバージョンアップですけどね...w

今回は3系の最新バージョンである 3.10.1 にあげることにしました。

ちなみに現在のバージョンは以下のとおりです。

$ ./bin/cake version 3.6.15

本題

基本的に問題なく動きました。

ただ、一点、バージョン 3.7 にあった以下の振る舞いの変更に引っかかりました。

Cake\Database\Type\IntegerType は SQL を生成しデータベースの結果を PHP の型に変換するときに 値が数値ではない場合に例外を発生させるようになります。

github.com

database的にリレーション制約をつけていないけど、cake側でリレーション関係を表しているような場合、join後nullになるようなパターンがあったりします。

たとえば、area_id というカラムには area.idが入るのですが、使われない場合に0に登録しておくみたいな感じです。

バッドパターンではありますが、何箇所かそのような部分があります。

このような場合、文字列の null が来るようになり、上記の is_numericに引っかかりエラーになりました。

3.6以前は 下記のように is_scalar でチェックしていたため問題なかったようです

github.com

こちらは、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のちょっとした記事になりました。

ちょっとプライベートが忙しすぎてアドベントカレンダーをキャンセルするという悪行をしてしまいました。。。 まじで反省しています。

現場からは以上です。

📎📎📎📎📎📎📎📎📎📎