Laravel 10から11に上げた時のconfigの扱いにご注意ください
はじめに
最初からLaravel11を使っていればあまり気にならないことかもしれないですが、
Laravel10などのバージョンからLaravel11に上げる際にconfigの扱いについて注意事項を少しまとめておこうと思います。
環境
- laravel/laravel 11.0.5
- laravel/framework 11.2.0
何が変わった
Laravel10まではconfigファイルはLaravel/laravelのconfigディレクトリにありましたが、
それがlaravel/frameworkの方に移動しました。
移動したといっても、元々のLaravel/laravelの方にも残っています。
※一度消えたけど戻していますね
じゃあ何が変わったのか
結論を書くと動作が変わりました。
Laravel10まであれば、configから使わないものを削除すると利用できないですが、
Laravel11からはlaravel/framework側に存在していれば利用することが可能になりました。
たとえば、Laravel/laravelのconfig/database.phpにあるpgsql
の項目を削除した場合のそれぞれの動作を確認してみます。
- 'pgsql' => [
- 'driver' => 'pgsql',
- 'url' => env('DB_URL'),
- 'host' => env('DB_HOST', '127.0.0.1'),
- 'port' => env('DB_PORT', '5432'),
- 'database' => env('DB_DATABASE', 'laravel'),
- 'username' => env('DB_USERNAME', 'root'),
- 'password' => env('DB_PASSWORD', ''),
- 'charset' => env('DB_CHARSET', 'utf8'),
- 'prefix' => '',
- 'prefix_indexes' => true,
- 'search_path' => 'public',
- 'sslmode' => 'prefer',
- ],
+ // 'pgsql' => [
+ // 'driver' => 'pgsql',
+ // 'url' => env('DB_URL'),
+ // 'host' => env('DB_HOST', '127.0.0.1'),
+ // 'port' => env('DB_PORT', '5432'),
+ // 'database' => env('DB_DATABASE', 'laravel'),
+ // 'username' => env('DB_USERNAME', 'root'),
+ // 'password' => env('DB_PASSWORD', ''),
+ // 'charset' => env('DB_CHARSET', 'utf8'),
+ // 'prefix' => '',
+ // 'prefix_indexes' => true,
+ // 'search_path' => 'public',
+ // 'sslmode' => 'prefer',
+ // ],
- Laravel10
% php artisan tinker
Psy Shell v0.12.0 (PHP 8.3.4 — cli) by Justin Hileman
>
> config('database.connections.pgsql');
= null
- Laravel11
% php artisan tinker
Psy Shell v0.12.2 (PHP 8.3.4 — cli) by Justin Hileman
>
>
> config('database.connections.pgsql');
= [
"driver" => "pgsql",
"url" => null,
"host" => "127.0.0.1",
"port" => "5432",
"database" => "laravel",
"username" => "root",
"password" => "",
"charset" => "utf8",
"prefix" => "",
"prefix_indexes" => true,
"search_path" => "public",
"sslmode" => "prefer",
]
どこでこれが起きているのか
LoadConfigurationクラスのloadConfigurationFileメソッドの処理で起きています。
引数の$base
がlaravel/framework側のconfigの項目です。
そこに指定したpathのconfigの内容で上書きする処理が動きます。
指定したpathのconfigの方に項目が存在しない場合、laravel/framework側のconfigの項目が有効になるために今回の事象が発生しています。
まとめ
過去に不要だから消した項目もLaravel11に上げると復活する項目が存在します。
不要なので復活しても気にならないケースが多いかもしれないですが、意図しない動作に変わる可能性もあるのでバージョンを上げた際には注意しておいた方がいいかもしれないですね。
Discussion
※2024/12/06追記
今回の内容を回避する手段は別記事で書いてあります。