開発ブログ

株式会社Nextatのスタッフがお送りする技術コラムメインのブログ。

電話でのお問合わせ 075-744-6842 ([月]-[金] 10:00〜17:00)

  1. top >
  2. 開発ブログ >
  3. PHP >
  4. Laravel >
  5. Laravel 11でのconfig周りの変更

Laravel 11でのconfig周りの変更

laravel11-webpage.png
こんにちは、ナカエです。 本日は最近リリースされたLaravel 11の記事です。

Laravel 11はスケルトンのスリム化を一つの目標に掲げていたようで、configファイルの扱いも変更されています。 Kernel周りの大幅な変更などに比べると目立たないですが、後方互換性が気になったので調査しました。

環境

  • macOS 13.6.3 (Ventura)
  • PHP 8.3.4
  • Laravel 10.48.3
  • Laravel 11.0.7

設定ファイルの値のマージ

configディレクトリ以下の設定ファイルが、Laravelデフォルトの設定ファイルとマージされるという挙動が1つ目のポイントです。
 

before: Laravel 10

Laravel 10での挙動をおさらいします。 試しに初期状態のconfig/database.phpのconnectionsの配列からmysql以外のキーを削除します。

    // 略
    'connections' => [            
        'mysql' => [ 
            'driver' => 'mysql',
            'url' => env('DATABASE_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],
    ],
    // 略

Tinkerでconfigの値を確認します。

$ php artisan tinker
Psy Shell v0.12.2 (PHP 8.3.4 — cli) by Justin Hileman
> config('database.connections')
= [
    "mysql" => [
      "driver" => "mysql",
      "url" => null,
      "host" => "127.0.0.1",
      "port" => "3306",
      "database" => "laravel",
      "username" => "root",
      "password" => "",
      "unix_socket" => "",
      "charset" => "utf8mb4",
      "collation" => "utf8mb4_unicode_ci",
      "prefix" => "",
      "prefix_indexes" => true,
      "strict" => true,
      "engine" => null,
      "options" => [],
    ],
  ]

単純にconfig/database.phpの値がそのまま反映されていることがわかります。

after: Laravel 11

同様にLaravel 11でもconfig/database.phpのconnectionsからmysql以外のキーを消してみましょう。

    // 略
    'connections' => [
        'mysql' => [
            'driver' => 'mysql',
            'url' => env('DB_URL'),
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'laravel'),
            'username' => env('DB_USERNAME', 'root'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => env('DB_CHARSET', 'utf8mb4'),
            'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
            'prefix' => '',
            'prefix_indexes' => true,
            'strict' => true,
            'engine' => null,
            'options' => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],
    ],
    // 略

Tinkerを用いて確認すると、下記のように削除したはずのsqliteやmariadbなどの設定が残っていることがわかります。

$ php artisan tinker
Psy Shell v0.12.2 (PHP 8.3.4 — cli) by Justin Hileman
> config('database.connections')
= [
    "sqlite" => [
      "driver" => "sqlite",
      "url" => null,
      "database" => "/Users/nextat/laravel11-test/database/database.sqlite",
      "prefix" => "",
      "foreign_key_constraints" => true,
    ],
    "mysql" => [
      "driver" => "mysql",
      "url" => null,
      "host" => "127.0.0.1",
      "port" => "3306",
      "database" => "laravel",
      "username" => "root",
      "password" => "",
      "unix_socket" => "",
      "charset" => "utf8mb4",
      "collation" => "utf8mb4_unicode_ci",
      "prefix" => "",
      "prefix_indexes" => true,
      "strict" => true,
      "engine" => null,
      "options" => [],
    ],
    "mariadb" => [
      "driver" => "mariadb",
      "url" => null,
      "host" => "127.0.0.1",
      "port" => "3306",
      "database" => "laravel",
      "username" => "root",
      "password" => "",
      "unix_socket" => "",
      "charset" => "utf8mb4",
      "collation" => "utf8mb4_unicode_ci",
      "prefix" => "",
      "prefix_indexes" => true,
      "strict" => true,
      "engine" => null,
      "options" => [],
    ],
    // 略

この挙動を活用することで、Laravelのデフォルトから変更していないキーを省略し、configディレクトリ以下の設定ファイルの記述量を減らすことができます。
ただの浅いマージでありディープマージではない点は把握しておいたほうが良さそうです。

個人的にはデフォルトの設定とマージされる挙動を把握していないと混乱の元になる可能性もあると思いました。 今まで通り全ての項目を記述する運用も可能ですので、configファイルの記述量減少にそこまでメリットを感じない場合は従来のやり方でも問題なさそうですね。

デフォルトでpublishされていないconfigファイル

デフォルトではconfig以下に配置されておらず、変更のためにはArtisanコマンドを使ってpublishする必要がある設定ファイルがいくつかあります。 Laravel 10と比較すると

  • broadcasting.php
  • cors.php
  • hashing.php
  • view.php


の4ファイルが初期状態ではconfigディレクトリには存在しません。 経験上これらは直接ファイルを変更することは少ないので、デメリットの少ない変更と感じます。 なお、一度はconfigディレクトリ内のファイルをデフォルトで全部なしにするという変更(https://github.com/laravel/laravel/pull/6188)が入っていたのが、後のコミットで上記のように緩和されたという経緯があるようです。

流石にやり過ぎということだったのでしょうか。

参考: Laravel 11 streamlined configuration files - Laravel News

まとめ

  • config以下の設定ファイルの値がデフォルトの設定とマージされる
  • いくつかpublishされていないconfigファイルがあるので変更時には注意が必要

上記2点を把握しておけば、特に困ることはなさそうな印象でした。

TOPに戻る