🗂

Laravel 10から11に上げた時のconfigの扱いにご注意ください

2024/04/06に公開

はじめに

最初からLaravel11を使っていればあまり気にならないことかもしれないですが、
Laravel10などのバージョンからLaravel11に上げる際にconfigの扱いについて注意事項を少しまとめておこうと思います。

環境

  • laravel/laravel 11.0.5
  • laravel/framework 11.2.0

何が変わった

Laravel10まではconfigファイルはLaravel/laravelのconfigディレクトリにありましたが、
それがlaravel/frameworkの方に移動しました。

https://github.com/laravel/framework/tree/v11.2.0/config

移動したといっても、元々のLaravel/laravelの方にも残っています。
※一度消えたけど戻していますね

https://github.com/laravel/laravel/tree/v11.0.5/config

じゃあ何が変わったのか

結論を書くと動作が変わりました。

Laravel10まであれば、configから使わないものを削除すると利用できないですが、
Laravel11からはlaravel/framework側に存在していれば利用することが可能になりました。

例えば、
Laravel/laravelのconfig/database.phpにあるpgsqlの項目を削除した場合のそれぞれの動作を確認してみます。

config/database.php
-        '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",
  ]

どこでこれが起きているのか

https://github.com/laravel/framework/blob/11.x/src/Illuminate/Foundation/Bootstrap/LoadConfiguration.php#L89-L107

LoadConfigurationクラスのloadConfigurationFileメソッドの処理で起きています。

引数の$baseがlaravel/framework側のconfigの項目です。
そこに指定したpathのconfigの内容で上書きする処理が動きます。

指定したpathのconfigの方に項目が存在しない場合、laravel/framework側のconfigの項目が有効になるために今回の事象が発生しています。

まとめ

過去に不要だから消した項目もLaravel11に上げると復活する項目が存在します。
不要なので復活しても気にならないケースが多いかもしれないですが、意図しない動作に変わる可能性もあるのでバージョンを上げた際には注意しておいた方がいいかもしれないですね。

Discussion