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へのアップグレードは、少し時間がかかるプロセスですが、安定性、セキュリティ、そして新しい機能を享受するためには非常に価値のある作業です。このガイドが役立つことを願っています。幸運を祈ります!
※参考にする場合は自己責任でお願いします。