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

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

cakephpのバージョンアップ実行

はじめに

こんにちは。

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

今回は現在お世話になっている案件の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のちょっとした記事になりました。

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

現場からは以上です。