見出し画像

3年ぶりにLaravelをアップグレードしたら大変だった

こんにちは、エンジニアの濱崎です。みなさん、フレームワークやプログラミング言語のアップグレードはどんなタイミングでやっていますか?

機能の開発などに比べて、フレームワークのアップグレードは後回しになりがちじゃないでしょうか?なかなかアップグレードにリソースを割けないときもありますが、放置しすぎると後から苦労する羽目になります。

クラシコムでは最近、メインのフレームワークとして使っているLaravelを最新版の5.6にアップグレードしました。実は、約3年間アップグレードを怠っていて、Lumen5.1からLaravel5.6へのアップグレードだったので、変更点が多くて大変でした。

3年間アップグレードしなかったツケは大きかった

3年間アップグレードしていなかったので、フレームワークのアップグレードだけでは済まず、PHPやテストフレームワークのアップグレードも必要となり、一筋縄にはいきませんでした。

・Laravel5.5からPHP5系をサポートしなくなったので、Laravelをアップグレードする前にPHP5.6からPHP7.2にアップグレード
・無事、PHP7.2にアップグレードできたものの、phpunit4がPHP7に対応しておらず、一部のテストで不具合が発生
・phpunitをアップグレードしようとしたけど、Lumen5.1がphpunit4系しかサポートしていなかった…
・仕方ないので、Laravel5.6へのアップグレードが完了するまではphpunit4を頑張って使う
・Laravel5.6にアップグレードと同時に、phpunitとmockeryもアップグレード 🙌


なんとかアップグレードが完了し、現在(2018年6月)は以下のようなスタックで開発しています。

PHP 5.6  →  PHP 7.2
Lumen 5.1  →  Laravel 5.6
phpunit 4.7.7  →  phpunit ^7.0
mockery 0.9.4  →   mockery ^1.0


アップグレードを担当したオリバーさんにインタビュー

実際のアップグレード作業は、リモートで開発をサポートしてくれているオリバーさんに担当してもらいました。
今やLaravelアップグレードのエキスパートと言っても過言ではないオリバーさんに、3つの質問に答えてもらいました。

Q1: どんな手順でLaravelのアップグレードを進めたんですか?

まず、Laravel5.6で新規のリポジトリを作って、アップグレード前の旧リポジトリから .gitフォルダをコピーしてきました。
Gitのdiffを確認しながら作業できるので、アップグレードによって追加されたファイルや、コンフィグの変更点などが分かりやすいです。
既存リポジトリを少しずつ修正していくよりも、こっちの方が断然楽だし安全だと思います。


Q2: どんなことに苦労しましたか?

QueryBuilderのgetメソッドの戻り値の型が変わっていて苦労しましたね。Laravel5.1ではarrayが返ってきていたんですが、新しいバージョンではCollectionオブジェクトが返ってきます
例えば以下のようなコードがあったとして、$productsが空のarrayの場合はfalseですが、空のCollectionオブジェクトだったらtrueとして評価されますね。count($products) としておけば問題なかったのですが、この違いに気づくまで時間がかかりました 😅
$products = $builder->table('products')
                    ->where('status', 1)
                    ->get();

if ($products) {
    $this->doSomething();
}


Q3: これからアップグレードする人にアドバイスはありますか?

・テストを書く!
基本的なことですが、やっぱりこれが大事です。アップグレードによって既存の機能が壊れても、テストを書いてあれば気づけますからね。↑のQueryBuilderの件も、ちゃんとテストを書いていたからこそ気づくことができました。

・こまめにアップグレードする

複数バージョンをまたぐアップグレードは変更点が多すぎて大変なので、新しいバージョンが出たら早めにアップグレードした方が良いと思います。
LaravelにはUpgrade Guideがあるけど、1バージョンごとのガイドしかないので、複数バージョンをまたぐのはオススメしません。

※インタビューは英語ですが、オリバーさんは日本語ペラペラです

アップグレードして良かった

アップグレード作業はけっこう大変でしたが、苦労してでもアップグレードして良かったです 🙌

CIのビルド時間が半分になった
PHP5からPHP7にしただけで、CIのビルド時間が半分になりました。
Production環境はPHP5.6の時代からOPcacheを使っていたので、速度面で劇的な変化はなかったものの、CPUやメモリの消費は小さくなりました。

PHP7の型宣言、イイ

PHP5までは関数の引数の型宣言はできましたが、PHP7では戻り値の型宣言文もできるので、オブジェクト指向の恩恵を受けながら堅牢なアプリケーションを作ることができます。PhpStormなどのエディタでは補完もいい感じで効いてくれるそうです。

Laravel Mix

Laravel Mixは、WebpackをLaravelで簡単に扱えるようにしたラッパーです。
以前は複雑なgulpfileを書いてアセットをビルドしていましたが、Laravel Mixを使えば大抵のユースケースは簡単に実現できます。

安心感・ワクワク感
最新版を使っている安心感と、新機能に触れられるワクワク感によってモチベーションが高まります。
こういったワクワク感やモチベーションは、エンジニアのパフォーマンスにも影響する大事な要素だと思います。


さいごに

今回の経験を通して、今後はこまめにアップグレードして負債を残さないようにしようと心に誓いました。

クラシコムでは最新のPHPとLaravelを使い、DDDを取り入れた開発を進めています。この開発環境のもとで、ECでの新しい「買い物」体験を作っていこうと考えているので、ご興味がある方はぜひ一度オフィスに遊びに来てみてください。