Edited at

Laravel の LTS のアップグレード(5.5->6.x)を細かくみてみる


概要

Laravel の LTS が 5.5 から 6 に上がったので、既存の Laravel5.5 アプリケーションをアップグレードしたところ、これホントに6?と思ったので、詳しく見てみた。

先に結論としては、だいたい6だけど6じゃない。です。


検証環境


  • MBP 13-inch, 2017

  • macOS Mojave v10.14.6

  • PHP version: 7.3.11

  • Composer version: 1.9.1

2019年11月7日に実行


手順



  1. 5.56をそれぞれ用意する


  2. 5.5に修正を加え6にアップグレードする


  3. 5.5から6にアップグレードしたものと、6を比較する


1. 5.56をそれぞれ用意する

Composer で 5.56を用意する。

$ composer create-project --prefer-dist laravel/laravel 5.5 "5.5.*"

$ composer create-project --prefer-dist laravel/laravel 6

こんな感じ

.

├── 5.5 # 5.5 の初期状態を 6 にアップグレードする
└── 6 # 6 の初期状態


2. 5.5に修正を加え6にアップグレードする

まずは composer.json を更新する。laravel のバージョンと、PHP のバージョンを上げる必要があります。5.56composer.json を比較すると記述する順番が変わっていたりしますが、大差ないので、今回は6のものをだいたい正として変更します。

変更内容はこんな感じ(~, ^ の違いは省略)


5.5/composer.json

...

"require": {
- "php": ">=7.0.0",
+ "php": "^7.2",
- "fideloper/proxy": "~3.3",
+ "fideloper/proxy": "^4.0",
- "laravel/framework": "5.5.*",
+ "laravel/framework": "^6.2",
"laravel/tinker": "^1.0"
},
"require-dev": {
"filp/whoops": "~2.0",
+ "facade/ignition": "^1.4"
"fzaninotto/faker": "^1.4",
"mockery/mockery": "^1.0",
+ "nunomaduro/collision": "^3.0",
- "phpunit/phpunit": "~6.0",
+ "phpunit/phpunit": "^8.0",
"symfony/thanks": "^1.0"
},
...
"scripts": {
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
- "@php artisan key:generate"
+ "@php artisan key:generate --ansi"
],
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
- "@php artisan package:discover"
+ "@php artisan package:discover --ansi"
]
},
...

公式ドキュメントには、laravel のバージョンは、^6.0と書くようにとありましたが、本日 composer install すると^6.2となっていました。ま、どちらでも良いので気にしないことにします。

準備完了な気がしますが、このままだと composer update できないので、以下3ファイルを修正します。


5.5/config/app.php

    'aliases' => [

...
+ 'Arr' => Illuminate\Support\Arr::class,
+ 'Str' => Illuminate\Support\Str::class,
...


5.5-6/config/cache.php

<?php

+ use Illuminate\Support\Str;
...
'prefix' => env(
'CACHE_PREFIX',
- str_slug(env('APP_NAME', 'laravel'), '_').'_cache'
+ Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'
),



5.5/config/session.php

<?php

+ use Illuminate\Support\Str;
...
'cookie' => env(
'SESSION_COOKIE',
- str_slug(env('APP_NAME', 'laravel'), '_').'_session'
+ Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
),
...


この状態で、composer update すると、5.5 だったものが、6系に上がり、いちおう動くようになります。


3. 5.5から6にアップグレードしたものと、6を比較する

差分を取ってみます。ファイルレベルでどの程度違いがあるのかを見てみます。vendor や関係なさそうなものは除外すると、以下のようになります。本当は、composer updateで変更されるのは、vendorなので、前述の準備をする必要はないんですが、いったん、6系にアップグレードしたつもりになっている状態と6系の違いを見ているということで。

AMD は 5.5 -> 6 から6に対して見た状況です。

M       .env

M .env.example
M app/Http/Kernel.php
D app/Http/Middleware/CheckForMaintenanceMode.php
M app/Http/Middleware/TrustProxies.php
M app/Http/Middleware/VerifyCsrfToken.php
M app/Providers/AuthServiceProvider.php
M app/Providers/EventServiceProvider.php
M bootstrap/app.php
M composer.json
M config/app.php
M config/auth.php
M config/broadcasting.php
M config/cache.php
M config/database.php
M config/filesystems.php
D config/hashing.php
D config/logging.php
M config/mail.php
M config/queue.php
M config/services.php
M config/session.php
M config/view.php
M package.json
M phpunit.xml
D resources/js/app.js
D resources/js/bootstrap.js
M resources/lang/en/passwords.php
M resources/lang/en/validation.php
D resources/sass/app.scss
M tests/CreatesApplication.php
M webpack.mix.js

詳細をここに書いていくのはしんどいので、以下を参照してください。


Comparison between Laravel 6 from 5.5 and Laravel 6 - Light


各バージョンでの変更の詳細は、Upgrade Guide などに任せます。(なんでLTS 間での Upgrade Guide ってないんですかね。)



これらが、ファイルの差を生み出しているはず。


簡単に結論

ちょっと疲れちゃったので、簡単に結論書いて終わります。

ざっくりどんな感じかと言うと、5.5以降に実装され、6系に踏襲された新機能が有効になっていない状態?のようです。(ちゃんと調べてないので、いい加減なこと言ってるかも知れません。いずれ訂正するかも知れませんが、”な感じ”です。)

例えば、Log をどうこうしたいみたいな時に、Laravel 6 のドキュメントを読むと config/logging.php をいじって…となりますが、

そんなファイルない!!相変わらず config/app.php の中でやってる!!!

みたいなことが起こります。将来的に、5.5 から 6 に上げたという背景を知らない人が開発したときに、問題起こりそうですね。

という訳で、お前のそれは Laravel 6 になってない!

じゃあどうすんの?というのは、また今度。