概要
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日に実行
手順
-
5.5
と6
をそれぞれ用意する -
5.5
に修正を加え6
にアップグレードする -
5.5
から6
にアップグレードしたものと、6
を比較する
1. 5.5
と6
をそれぞれ用意する
Composer で 5.5
と6
を用意する。
$ 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.5
と 6
の composer.json
を比較すると記述する順番が変わっていたりしますが、大差ないので、今回は6
のものをだいたい正として変更します。
変更内容はこんな感じ(~, ^ の違いは省略)
...
"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ファイルを修正します。
'aliases' => [
...
+ 'Arr' => Illuminate\Support\Arr::class,
+ 'Str' => Illuminate\Support\Str::class,
...
<?php
+ use Illuminate\Support\Str;
...
'prefix' => env(
'CACHE_PREFIX',
- str_slug(env('APP_NAME', 'laravel'), '_').'_cache'
+ Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'
),
<?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
詳細をここに書いていくのはしんどいので、以下を参照してください。
各バージョンでの変更の詳細は、Upgrade Guide などに任せます。(なんでLTS 間での Upgrade Guide ってないんですかね。)
これらが、ファイルの差を生み出しているはず。
簡単に結論
ちょっと疲れちゃったので、簡単に結論書いて終わります。
ざっくりどんな感じかと言うと、5.5
以降に実装され、6
系に踏襲された新機能が有効になっていない状態?のようです。(ちゃんと調べてないので、いい加減なこと言ってるかも知れません。いずれ訂正するかも知れませんが、”な感じ”です。)
例えば、Log をどうこうしたいみたいな時に、Laravel 6 のドキュメントを読むと config/logging.php
をいじって…となりますが、
そんなファイルない!!相変わらず config/app.php
の中でやってる!!!
みたいなことが起こります。将来的に、5.5
から 6
に上げたという背景を知らない人が開発したときに、問題起こりそうですね。
という訳で、お前のそれは Laravel 6 になってない!
じゃあどうすんの?というのは、また今度。