⚠️

Laravel11へのアップグレード(スリム化版)

2024/03/13に公開

Laravel11へのアップグレード(スリム化版)

https://laravel.com/docs/11.x/releases
https://laravel.com/docs/11.x/upgrade

警告

Laravel10から11のアップグレードではアプリケーション構造のスリム化に追従は公式からは推奨されてない。
追従しなくてもLaravel11にアップグレードできるし、今まで通りの使い方ができる。

今後のためにどうしてもスリム化したい場合のみに向けた情報。

対象プロジェクト

Laravel10を指定して作成した新規プロジェクト。

composer create-project laravel/laravel:^10.0 slim

SQLiteを使うように.env変更。

DB_CONNECTION=sqlite
#DB_HOST=127.0.0.1
#DB_PORT=3306
#DB_DATABASE=laravel
#DB_USERNAME=root
#DB_PASSWORD=

テスト時のDBは:memory:を使う。

phpunit.xml
         <env name="DB_CONNECTION" value="sqlite"/>
         <env name="DB_DATABASE" value=":memory:"/>

Breeze v1.29をインストール。bladeスタック。

composer require laravel/breeze --dev
php artisan breeze:install blade

php artisan migrate

php artisan testでテストしながら確認していく。

composer.json の更新

    "require": {
+        "php": "^8.2",
+        "laravel/framework": "^11.0",
+        "laravel/sanctum": "^4.0",
    },
    "require-dev": {
+        "laravel/breeze": "^2.0",
+        "nunomaduro/collision": "^8.1",
    },

サードパッケージはないので問題なくcomposer updateできる。

テストOK。

スリム化に追従しないアップグレード作業はこれだけで終わり。後はスリム化とは関係ない通常のアップグレードを行う。

Controllerのスリム化

影響の少なそうなところから進める。

app/Http/Controllers/Controller.php
<?php

namespace App\Http\Controllers;

abstract class Controller
{
    //
}

テストOK。

使われてないので影響ない。

RouteServiceProvider::HOMEを修正

すべてroute('dashboard', absolute: false)に変更。
ここを参考に。
https://github.com/laravel/breeze/commit/bb8429eb752faa631ae332165985038d3c19d5a3

RouteServiceProviderをコメントにしてテストが成功すれば問題ない。

app/Providers/RouteServiceProvider.php
//public const HOME = '/dashboard';

API機能を削除

ひとまずLaravel11デフォルトと揃える。sanctumを使ってるプロジェクトなら削除しない。スリム化が終わってからなら再インストールが可能。

composer.json
- "laravel/sanctum": "^4.0",
  • routes/api.php
  • config/sanctum.php

RouteServiceProviderのapi部分だけ削除。

app/Providers/RouteServiceProvider.php
        $this->routes(function () {
-            Route::middleware('api')
-                ->prefix('api')
-                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->group(base_path('routes/web.php'));
        });

UserのHasApiTokensを削除。

app/Models/User.php
- use Laravel\Sanctum\HasApiTokens;

class User extends Authenticatable
{
    use HasFactory, Notifiable;

ブロードキャスト機能を削除

  • routes/channels.php
  • config/broadcasting.php
  • app/Providers/BroadcastServiceProvider.php は後で削除でもいい。

configファイルを削除

  • config/cors.php
  • config/hashing.php
  • config/view.php

ファイルの中身も変わってるので最新のファイルに全部入れ替えたほうがいいかもしれない。
https://github.com/laravel/laravel/tree/11.x/config

デフォルトから変更してるファイルは残し、他は削除するか入れ替える。
プロジェクトごとに判断して対応する箇所。

ここからは大きな変更

しばらくテストなしで変更していく。コピペするだけ。

bootstrap/app.php

古くなる記事ではなくGitHubの最新のコードを見て書き換え。
https://github.com/laravel/laravel/blob/11.x/bootstrap/app.php

bootstrap/providers.php追加

これもGitHubから。
https://github.com/laravel/laravel/blob/11.x/bootstrap/providers.php

public/index.php

これもGitHubから。Httpコンテキストの入り口はpublic/index.php
https://github.com/laravel/laravel/blob/11.x/public/index.php

artisan

これもGitHubから。Consoleコンテキストの入り口はartisan
https://github.com/laravel/laravel/blob/11.x/artisan

普段はあまり意識しないけどpublic/index.phpartisanが入り口。

ここまで一気に変更するとテストもphp artisan serveも正常に動く。

ここまで来ればLaravel11の普通の使い方ができる

ミドルウェアで変更している設定があればbootstrap/app.phpに移動。

Scheduleはroutes/console.phpに移動。

不要なファイルの削除

  • app/Console/Kernel.php app/Console/Commandsは残す。
  • app/Exceptions
  • app/Http/Middleware デフォルトミドルウェアを削除。
  • app/Http/Kernel.php
  • app/Providers AppServiceProvider以外のデフォルトを削除。
  • config/app.phpprovidersaliasesを削除。

tests/TestCase.php変更

CreatesApplicationが不要に変わっているのでTestCaseを修正。
https://github.com/laravel/laravel/blob/11.x/tests/TestCase.php

tests/CreatesApplication.phpは削除。

.env .env.example phpunit.xml変更

増えてる項目を追加。
https://github.com/laravel/laravel/blob/11.x/.env.example
phpunit.xml<env>部分を変更。
https://github.com/laravel/laravel/blob/11.x/phpunit.xml

CACHE_DRIVERからCACHE_STOREに変わったりしている。

.envを変更するならphpunit.xmlやconfig全体の見直しも必要。
間違えるとテストが失敗するようになるのでこの辺りの変更は慎重に。

複数人で開発している場合、各自の.envを変更するのは大変なのでconfig周りの変更は追従しないほうがよさそう。

migrationsの追加

Laravel11ではデフォルトのmigrationsが変わっているけど既存のmigrationsを変更してはいけないので足りないテーブルだけ追加。
https://github.com/laravel/laravel/tree/11.x/database/migrations

全部専用のコマンドが用意されている。

php artisan make:session-table
php artisan make:cache-table
php artisan make:queue-table
php artisan make:queue-batches-table

php artisan migrate

これでLaravel11と同じ。

スリム化作業は以上

アップグレードガイドの変更やパッケージの変更への対応は別作業。

Laravelをよく理解してないと難しいのでスリム化は推奨できない。

Discussion