Laravel

Laravel6から9へアップグレード:よくある落とし穴とその回避方法

Laravelを長年愛用している皆さん、今回は、Laravel6からLaravel9へアップグレードする具体的な手順をご紹介します。
アップグレードは、新機能の利用、セキュリティの強化、長期サポートの継続など、多くのメリットがあります。では、手順に入りましょう。

前提条件

  • PHPのバージョンが8.0以上であること
  • 現在のLaravel6アプリケーションが正常に動作していること
  • データベースとアプリケーションのバックアップが取れていること

メリットとデメリット

アップグレードには以下のようなメリットとデメリットがあります。

メリット

  • 最新のセキュリティ対策とバグ修正の利用
  • パフォーマンスの向上と新機能の追加
  • 長期的なサポートとコミュニティからのサポート

デメリット

  • 互換性の問題によるコードの修正が必要
  • アップグレードプロセスには時間とリソースがかかる

ステップ1:バックアップの準備

最初に、現在のアプリケーションとデータベースの完全なバックアップを取ります。万が一の問題が発生した場合に備えて、これは非常に重要です。

ステップ2:環境の更新

Laravel9はPHP8.0以上を必要とします。サーバーのPHPバージョンを確認し、必要であればアップグレードしてください。また、必要なPHP拡張機能もインストールしましょう。

ステップ3:composer.jsonの更新

ここに結構時間がかかりました。
プロジェクトのcomposer.jsonファイルを開き、requireセクションのLaravelのバージョンを「9.*」に変更します。また、他のパッケージもLaravel9との互換性があるか確認し、必要に応じてバージョンを更新してください。

composer.jsonファイルの編集は、Laravelのバージョンをアップグレードする際の重要なステップの一つです。
以下に、Laravel6からLaravel9へのアップグレードの際のcomposer.jsonファイルの編集方法を説明します。

composer.jsonファイルを開く

まず、プロジェクトのルートディレクトリにあるcomposer.jsonファイルをテキストエディタで開きます。

Laravelのバージョンを更新する

requireセクションを探し、laravel/frameworkのバージョンを現在の6.xから9.*に変更します。例えば、次のようになります。

"require": {
    "php": "^8.0",
    "laravel/framework": "9.*",
    // 他の依存関係...
},

PHPバージョンの確認

Laravel9はPHP 8.0以上が必要です。composer.jsonのrequireセクションにあるPHPのバージョンも適切に設定されていることを確認します。例えば、”php”: “^8.0″というように記述します。

その他の依存関係の確認

他のパッケージ(例えば、fideloper/proxyやlaravel/tinkerなど)もLaravel9と互換性があるバージョンになっていることを確認し、必要に応じて更新します。

composer.jsonファイルの編集

Laravel6のcomposer.jsonファイル

{
    "name": "laravel/laravel",
    "type": "project",
    "description": "The Laravel Framework.",
    "keywords": [
        "framework",
        "laravel"
    ],
    "license": "MIT",
    "require": {
        "php": "^7.2.5|^8.0",
        "fideloper/proxy": "^4.4",
        "laravel/framework": "^6.20",
        "laravel/tinker": "^2.5",
        "maatwebsite/excel": "^3.1"
    },
    "require-dev": {
        "facade/ignition": "^1.16.4",
        "fakerphp/faker": "^1.9.1",
        "laravel/ui": "^1.0",
        "mockery/mockery": "^1.0",
        "nunomaduro/collision": "^3.0",
        "phpunit/phpunit": "^8.5.8|^9.3.3"
    },


その他の記述...

Laravel9変更後のcomposer.jsonファイル

{
    "name": "laravel/laravel",
    "type": "project",
    "description": "The Laravel Framework.",
    "keywords": [
        "framework",
        "laravel"
    ],
    "license": "MIT",
    "require": {
        "php": "^8.2",
        "fideloper/proxy": "^4.4",
        "laravel/framework": "^9.0",
        "laravel/tinker": "^2.5",
        "maatwebsite/excel": "^3.1"
    },
    "require-dev": {
        "spatie/laravel-ignition": "^1.0",
        "fakerphp/faker": "^1.9.1",
        "laravel/ui": "^3.4",
        "mockery/mockery": "^1.4.4",
        "nunomaduro/collision": "^6.1",
        "phpunit/phpunit": "^9.5.10"
    },

その他の記述...

Laravel6のcomposer.jsonファイルの記述で
“facade/ignition”: “^1.16.4”,
のままやバージョンを変更しただけだとupdateの時にエラー
例:「Conclusion: don’t install laravel/framework v9~
等が出ました。
「facade/ignition~」の記述を
“spatie/laravel-ignition”: “^1.0”,
に変更し、updateすることでエラーが解消されました。

変更を保存し、依存関係を更新

変更を保存した後、コマンドラインでプロジェクトのルートディレクトリに移動し、以下のコマンドを実行して依存関係を更新します。

composer update

エラーの確認と対処

composer updateの実行中にエラーが発生した場合は、エラーメッセージを注意深く読み、必要に応じて追加の修正を行います。これには、互換性のないパッケージの更新や、特定のパッケージのバージョン固定が含まれることがあります。

composer.jsonの編集と依存関係の更新は、Laravelのバージョンアップグレードにおいて非常に重要です。正確に行うことで、アップグレードプロセスがスムーズに進みます。また、アップグレードの際には、常にバックアップを取ることと、開発環境での十分なテストを忘れないでください。

ステップ4:コードの変更と修正

Laravelのアップグレードガイドを参照しながら、必要なコードの変更を行います。特に、ルーティング、ミドルウェア、モデルなど、Laravel9で変更された部分に注意しましょう。

app/Exceptions/Handler.phpファイルの修正

修正前

namespace App\Exceptions;

use Exception;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that are not reported.
     *
     * @var array
     */
    protected $dontReport = [
        //
    ];

    /**
     * A list of the inputs that are never flashed for validation exceptions.
     *
     * @var array
     */
    protected $dontFlash = [
        'password',
        'password_confirmation',
    ];

    /**
     * Report or log an exception.
     *
     * @param  \Exception  $exception
     * @return void
     *
     * @throws \Exception
     */
    public function report(Exception $exception)
    {
        parent::report($exception);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $exception
     * @return \Symfony\Component\HttpFoundation\Response
     *
     * @throws \Exception
     */
    public function render($request, Exception $exception)
    {
        return parent::render($request, $exception);
    }
}

 
修正後

namespace App\Exceptions;

use Throwable;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that are not reported.
     *
     * @var array
     */
    protected $dontReport = [
        //
    ];

    /**
     * A list of the inputs that are never flashed for validation exceptions.
     *
     * @var array
     */
    protected $dontFlash = [
        'password',
        'password_confirmation',
    ];

    /**
     * Report or log an exception.
     *
     * @param  \Exception  $exception
     * @return void
     *
     * @throws \Exception
     */
    public function report(Throwable $exception)
    {
        parent::report($exception);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $exception
     * @return \Symfony\Component\HttpFoundation\Response
     *
     * @throws \Exception
     */
    public function render($request, Throwable $exception)
    {
        return parent::render($request, $exception);
    }
}

app/Http/Middleware/TrustProxies.phpファイルの修正

修正前

namespace App\Http\Middleware;

use Fideloper\Proxy\TrustProxies as Middleware;
use Illuminate\Http\Request;

class TrustProxies extends Middleware
{
    /**
     * The trusted proxies for this application.
     *
     * @var array|string
     */
    protected $proxies="**";

    /**
     * The headers that should be used to detect proxies.
     *
     * @var int
     */
    protected $headers = Request::HEADER_X_FORWARDED_ALL;
}

 
修正後

namespace App\Http\Middleware;

use Fideloper\Proxy\TrustProxies as Middleware;
use Illuminate\Http\Request;

class TrustProxies extends Middleware
{
    /**
     * The trusted proxies for this application.
     *
     * @var array|string
     */
    protected $proxies="**";

    /**
     * The headers that should be used to detect proxies.
     *
     * @var int
     */
    //protected $headers = Request::HEADER_X_FORWARDED_ALL;
    protected $headers =
        Request::HEADER_X_FORWARDED_FOR |
        Request::HEADER_X_FORWARDED_HOST |
        Request::HEADER_X_FORWARDED_PORT |
        Request::HEADER_X_FORWARDED_PROTO |
        Request::HEADER_X_FORWARDED_AWS_ELB;
}

ステップ5:アプリケーションのテスト

アップグレード後は、アプリケーションが正常に動作するかを徹底的にテストします。問題が発見された場合は、修正を行い、再度テストを行います。

注意点

  • 開発環境での完全なテストが不可欠です。
  • サードパーティのパッケージがLaravel9と互換性があるかを確認してください。
  • ステージング環境でのテストを経てから、本番環境にデプロイすることを推奨します。

まとめ

Laravel6からLaravel9へのアップグレードは、少し時間がかかるプロセスですが、安定性、セキュリティ、そして新しい機能を享受するためには非常に価値のある作業です。このガイドが役立つことを願っています。幸運を祈ります!

 
※参考にする場合は自己責任でお願いします。