laravel

doctrine/dbal:2.6 でPHP7.1が必要になった時の対策

Laravelのマイグレーションでは一部で doctrine/dbal を使う。
https://readouble.com/laravel/5.5/ja/migrations.html#column-modifiers

composer.json でこんな指定してるとする。

"doctrine/dbal": "^2.5",

PHP7.0の環境でcomposer install/updateするとバージョンが合わずにエラー。
Laravel5.5がPHP7.0なのに doctrine/dbal のために7.1が必要になる。

こう指定するとdbalは2.5だけどdoctrineの他のパッケージで7.1を要求される。

"doctrine/dbal": "2.5.*",

一つ一つ7.0で動くバージョンを指定なんてことは当然やりたくない。
7.1にするのが簡単な方法だけど一つだけまだ7.0なサーバーがあるのでなんとかする。

解決方法

composer.json でPHPバージョンを指定する。

変更前。Laravelのデフォルト。

    "config": {
        "preferred-install": "dist",
        "sort-packages": true,
        "optimize-autoloader": true
    }

変更後

    "config": {
        "preferred-install": "dist",
        "sort-packages": true,
        "optimize-autoloader": true,
        "platform": {
            "php": "7.0.25"
        }
    }

7.0は7.0.0と同じで一部パッケージでもう少し上のバージョンを要求されるのでサーバーに合わせてパッチバージョンまで書く。

この方法なら

"doctrine/dbal": "^2.5",

のままでも2.6がインストールされず他のパッケージもPHPバージョンの条件を満たしたものがインストールされる。

いずれPHP7.1にしたら元に戻す。

0.1のバージョンアップで必要なPHPバージョン変えるのはやめて欲しいけど
対策できるので BREAKING CHANGE ではないと思ってるらしい…。
http://www.doctrine-project.org/2017/07/25/php-7.1-requirement-and-composer.html

自分が作ってるものなら躊躇なくメジャーバージョン上げる。