编程

Laravel 11 精简配置文件

328 2024-03-12 20:21:00

Laravel 11 中,我最喜欢的功能之一是精简的配置文件。在 Laravel 11 的开发过程中,所有配置文件都从默认的 Laravel 安装中删除。然而,在发布前几周,Taylor 决定在默认的 Laravel 安装中重新包含精简版的配置文件,但保留了删除任何不需要的文件或选项的选项。

让我们更深入地了解这是如何避免错误并获得尽可能精简的应用程序的。毕竟,配置文件会给你的应用增加很多噪音。你还需要小心地让它们保持最新,因为它们在不断变化。这就是为什么我很高兴在 Laravel 11 中看到这个功能。

在内部,Laravel 将配置文件与框架默认文件合并。因此,如果你的应用程序有一个 config/database.php 文件,它将与 Laravel 的内部 config/database.php 文件合并。

这里有趣的是合并。从表面上看,这合并了顶级选项(浅合并)。这意味着你可以通过删除任何不使用的顶级选项来进一步精简配置文件。同样,配置文件中的任何选项都将自动与 Laravel 默认值合并。

让我们看一个在 Laravel 11 应用中使用以下 config/app.php 文件的快速示例:

<?php
 
return [
 
    'timezone' => 'America/Kentucky/Louisville',
 
    'custom_option' => 'foo'
 
];

由此产生的配置将是核心应用的所有配置选项(app.nameapp.envapp.debug等),以及重写的 app.timezone 并添加 app.custom_option

此合并适用于具有顶级选项的文件。但是,有些配置文件有嵌套的“drver”选项。

Laravel 在执行此合并时会做更多的工作。虽然它不是递归的,但 Laravel 会合并一些常见的嵌套选项。例如,database.connectionsfilesystem.disk 等。

有了这个额外的合并,不需要在 database.connections 下包含所有驱动(因为这是一个顶级选项),你可以将此部分精简为只有你使用的驱动。

例如,如果使用默认的测试和 mysql 数据库驱动,但在 Laravel 11 中也有一个自定义的 mysql_replica 驱动,那么 config/database.php 文件可能是:

<?php
 
return [
 
    'connections' => [
 
        'mysql_replica' => [
            'driver' => 'mysql',
            'url' => env('DB_REPLICA_URL'),
            'host' => env('DB_REPLICA_HOST', '127.0.0.1'),
            'port' => env('DB_REPLICA_PORT', '3306'),
            'database' => env('DB_DATABASE', 'laravel'),
            'username' => env('DB_REPLICA_USERNAME', 'root'),
            'password' => env('DB_REPLICA_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => env('DB_CHARSET', 'utf8mb4'),
            'collation' => env('DB_COLLATION', 'utf8mb4_0900_ai_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'),
            ]) : [],
       ],
 
    ]
 
];

当然,保留整个默认配置文件集及其所有选项也受欢迎。但是,如果你喜欢 Laravel 新的、更精简的应用结构,并希望将配置文件中的噪声减少到真正的自定义,就用这种方式。