Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

概要

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 になってない!

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

kurab
最近はコードはあんまり書きません。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away