配置
简介
Laravel 框架的所有配置文件都存储在 config 目录中。每个选项都有文档说明,请随意浏览这些文件,熟悉可用的选项。
这些配置文件允许你配置诸如数据库连接信息、邮件服务器信息,以及各种其他核心配置值(如应用程序 URL 和加密密钥)。
about 命令
Laravel 可以通过 about Artisan 命令显示应用程序的配置、驱动程序和环境概览。
1php artisan about
如果你只对应用程序概览输出的特定部分感兴趣,可以使用 --only 选项进行过滤:
1php artisan about --only=environment
或者,要详细探索特定配置文件的值,可以使用 config:show Artisan 命令:
1php artisan config:show database
环境配置
根据应用程序运行的环境使用不同的配置值通常很有帮助。例如,你可能希望在本地使用与生产服务器不同的缓存驱动程序。
为了让这一切变得简单,Laravel 使用了 DotEnv PHP 库。在全新的 Laravel 安装中,应用程序的根目录包含一个 .env.example 文件,定义了许多常见的环境变量。在 Laravel 安装过程中,该文件会自动复制为 .env。
Laravel 默认的 .env 文件包含一些常见的配置值,这些值可能会根据应用程序是在本地运行还是在生产 Web 服务器上运行而有所不同。这些值随后会由 config 目录中的配置文件使用 Laravel 的 env 函数读取。
如果你是在团队中开发,你可能希望继续在应用程序中包含并更新 .env.example 文件。通过在示例配置文件中放置占位符值,团队中的其他开发者可以清楚地看到运行应用程序需要哪些环境变量。
.env 文件中的任何变量都可以被外部环境变量(例如服务器级或系统级环境变量)覆盖。
环境文件安全性
你的 .env 文件不应提交到应用程序的版本控制系统中,因为使用该应用程序的每个开发人员或服务器可能需要不同的环境配置。此外,如果入侵者获得了对版本控制仓库的访问权限,这会带来安全风险,因为任何敏感凭据都会被泄露。
不过,你可以使用 Laravel 内置的 环境加密功能对环境文件进行加密。加密后的环境文件可以安全地放入版本控制系统中。
附加环境文件
在加载应用程序的环境变量之前,Laravel 会确定是否已从外部提供了 APP_ENV 环境变量,或者是否指定了 --env 命令行参数。如果是,Laravel 将尝试加载 .env.[APP_ENV] 文件(如果存在)。如果不存在,将加载默认的 .env 文件。
环境变量类型
.env 文件中的所有变量通常都被解析为字符串,因此创建了一些保留值,允许你从 env() 函数返回更广泛的类型:
.env 值 |
env() 值 |
|---|---|
| true | (bool) true |
| (true) | (bool) true |
| false | (bool) false |
| (false) | (bool) false |
| empty | (string) '' |
| (empty) | (string) '' |
| null | (null) null |
| (null) | (null) null |
如果你需要定义一个包含空格的环境变量值,可以通过将值括在双引号中来实现:
1APP_NAME="My Application"
获取环境配置
当应用程序接收到请求时,.env 文件中列出的所有变量都将被加载到 $_ENV PHP 超全局变量中。但是,你可以在配置文件中使用 env 函数来获取这些变量的值。事实上,如果你查看 Laravel 的配置文件,会发现许多选项已经在使用此函数。
1'debug' => (bool) env('APP_DEBUG', false),
传递给 env 函数的第二个值是“默认值”。如果给定的键没有对应的环境变量,则返回此值。
确定当前环境
当前应用程序环境是通过 .env 文件中的 APP_ENV 变量确定的。你可以通过 App 外观(facade)上的 environment 方法访问此值:
1use Illuminate\Support\Facades\App;2 3$environment = App::environment();
你也可以将参数传递给 environment 方法来确定环境是否匹配给定值。如果环境匹配任何给定的值,该方法将返回 true:
1if (App::environment('local')) {2 // The environment is local3}4 5if (App::environment(['local', 'staging'])) {6 // The environment is either local OR staging...7}
通过定义服务器级的 APP_ENV 环境变量,可以覆盖当前的环境检测。
加密环境文件
未加密的环境文件绝不应存储在版本控制系统中。但是,Laravel 允许你加密环境文件,以便它们可以与应用程序的其余部分一起安全地添加到版本控制系统中。
加密
要加密环境文件,可以使用 env:encrypt 命令:
1php artisan env:encrypt
运行 env:encrypt 命令会加密你的 .env 文件并将加密内容放入 .env.encrypted 文件中。解密密钥会显示在命令输出中,应将其存储在安全的密码管理器中。如果你想提供自己的加密密钥,可以在调用命令时使用 --key 选项。
1php artisan env:encrypt --key=3UVsEgGVK36XN82KKeyLFMhvosbZN1aF
提供的密钥长度应符合所用加密算法要求的密钥长度。默认情况下,Laravel 使用 AES-256-CBC 算法,该算法需要 32 个字符的密钥。你可以通过在调用命令时传递 --cipher 选项,随意使用 Laravel 加密器支持的任何算法。
如果你的应用程序有多个环境文件(例如 .env 和 .env.staging),你可以通过 --env 选项提供环境名称,从而指定要加密的环境文件。
1php artisan env:encrypt --env=staging
可读变量名
在加密环境文件时,可以使用 --readable 选项来保留可见的变量名,同时加密它们的值:
1php artisan env:encrypt --readable
这将生成一个具有以下格式的加密文件:
1APP_NAME=eyJpdiI6...2APP_ENV=eyJpdiI6...3APP_KEY=eyJpdiI6...4APP_DEBUG=eyJpdiI6...5APP_URL=eyJpdiI6...
使用可读格式可以让你查看存在哪些环境变量,而无需暴露敏感数据。它还使得审查拉取请求(pull requests)变得更加容易,因为你可以查看添加、删除或重命名了哪些变量,而无需解密文件。
在解密环境文件时,Laravel 会自动检测使用了哪种格式,因此 env:decrypt 命令不需要额外的选项。
使用 --readable 选项时,原始环境文件中的注释和空行不会包含在加密输出中。
解密
要解密环境文件,可以使用 env:decrypt 命令。该命令需要一个解密密钥,Laravel 将从 LARAVEL_ENV_ENCRYPTION_KEY 环境变量中获取该密钥:
1php artisan env:decrypt
或者,可以通过 --key 选项将密钥直接提供给命令:
1php artisan env:decrypt --key=3UVsEgGVK36XN82KKeyLFMhvosbZN1aF
当调用 env:decrypt 命令时,Laravel 将解密 .env.encrypted 文件的内容,并将解密后的内容放入 .env 文件中。
可以向 env:decrypt 命令提供 --cipher 选项,以便使用自定义的加密算法。
1php artisan env:decrypt --key=qUWuNRdfuImXcKxZ --cipher=AES-128-CBC
如果你的应用程序有多个环境文件(例如 .env 和 .env.staging),你可以通过 --env 选项提供环境名称,从而指定要解密的环境文件。
1php artisan env:decrypt --env=staging
为了覆盖现有的环境文件,你可以为 env:decrypt 命令提供 --force 选项。
1php artisan env:decrypt --force
访问配置值
你可以使用 Config 外观或全局 config 函数在应用程序的任何位置轻松访问配置值。可以使用“点”语法访问配置值,其中包括文件名和你想访问的选项。也可以指定一个默认值,如果配置选项不存在,则会返回该默认值:
1use Illuminate\Support\Facades\Config;2 3$value = Config::get('app.timezone');4 5$value = config('app.timezone');6 7// Retrieve a default value if the configuration value does not exist...8$value = config('app.timezone', 'Asia/Seoul');
要在运行时设置配置值,可以调用 Config 外观的 set 方法,或者向 config 函数传递一个数组:
1Config::set('app.timezone', 'America/Chicago');2 3config(['app.timezone' => 'America/Chicago']);
为了辅助静态分析,Config 外观还提供了类型化的配置获取方法。如果获取的配置值与预期类型不匹配,将抛出异常:
1Config::string('config-key');2Config::integer('config-key');3Config::float('config-key');4Config::boolean('config-key');5Config::array('config-key');6Config::collection('config-key');
配置缓存
为了给应用程序提速,你应该使用 config:cache Artisan 命令将所有配置文件缓存到单个文件中。这将把应用程序的所有配置选项组合成一个文件,框架可以快速加载该文件。
你通常应该在生产部署过程中运行 php artisan config:cache 命令。该命令不应在本地开发期间运行,因为在应用程序开发过程中,配置选项经常需要更改。
一旦配置被缓存,框架在处理请求或执行 Artisan 命令时将不会加载应用程序的 .env 文件;因此,env 函数只会返回外部的、系统级的环境变量。
因此,你应该确保仅在应用程序的配置(config)文件中调用 env 函数。通过查看 Laravel 的默认配置文件,你可以看到许多这样的例子。应用程序中的任何位置都可以通过 上述描述的 config 函数来访问配置值。
config:clear 命令可用于清除缓存的配置:
1php artisan config:clear
如果你在部署过程中执行 config:cache 命令,请确保仅在配置文件内调用 env 函数。一旦配置被缓存,.env 文件将不再被加载;因此,env 函数将只返回外部的、系统级的环境变量。
发布配置文件
大多数 Laravel 的配置文件都已经发布在应用程序的 config 目录中;但是,某些配置文件(如 cors.php 和 view.php)默认不会发布,因为大多数应用程序永远不需要修改它们。
不过,你可以使用 config:publish Artisan 命令来发布任何默认未发布的配置文件:
1php artisan config:publish2 3php artisan config:publish --all
调试模式
config/app.php 配置文件中的 debug 选项决定了向用户显示多少关于错误的信息。默认情况下,此选项设置为遵循 .env 文件中存储的 APP_DEBUG 环境变量的值。
对于本地开发,你应该将 APP_DEBUG 环境变量设置为 true。在生产环境中,该值应始终为 false。如果该变量在生产环境中设置为 true,则有向应用程序最终用户泄露敏感配置值的风险。
维护模式
当应用程序处于维护模式时,所有请求都将显示一个自定义视图。这使得在应用程序更新或进行维护时可以轻松地“禁用”它。维护模式检查已包含在应用程序的默认中间件栈中。如果应用程序处于维护模式,将抛出状态码为 503 的 Symfony\Component\HttpKernel\Exception\HttpException 实例。
要启用维护模式,请执行 down Artisan 命令:
1php artisan down
如果你希望所有维护模式响应都包含 Refresh HTTP 头,可以在调用 down 命令时提供 refresh 选项。Refresh 头将指示浏览器在指定的秒数后自动刷新页面:
1php artisan down --refresh=15
你也可以向 down 命令提供 retry 选项,它将作为 Retry-After HTTP 头的值,尽管浏览器通常会忽略此头信息:
1php artisan down --retry=60
绕过维护模式
为了允许使用密钥令牌绕过维护模式,你可以使用 secret 选项指定维护模式绕过令牌:
1php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"
将应用程序置于维护模式后,你可以导航到与此令牌匹配的应用程序 URL,Laravel 将向你的浏览器颁发一个维护模式绕过 cookie:
1https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515
如果你希望 Laravel 为你生成密钥令牌,可以使用 with-secret 选项。当应用程序处于维护模式后,密钥将显示给你:
1php artisan down --with-secret
访问此隐藏路由后,你将被重定向到应用程序的 / 路由。一旦 cookie 颁发给你的浏览器,你就可以像应用程序未处于维护模式一样正常浏览它。
你的维护模式密钥通常应由字母数字字符组成,并可选择包含短横线。应避免使用在 URL 中具有特殊含义的字符,例如 ? 或 &。
多服务器上的维护模式
默认情况下,Laravel 使用基于文件的系统来确定应用程序是否处于维护模式。这意味着要激活维护模式,必须在托管应用程序的每台服务器上执行 php artisan down 命令。
或者,Laravel 提供了一种基于缓存的方法来处理维护模式。此方法只需在其中一台服务器上运行 php artisan down 命令。要使用此方法,请修改应用程序 .env 文件中的维护模式变量。你应该选择一个所有服务器都可以访问的缓存 store。这可以确保维护模式状态在每台服务器上保持一致。
1APP_MAINTENANCE_DRIVER=cache2APP_MAINTENANCE_STORE=database
预渲染维护模式视图
如果你在部署期间使用 php artisan down 命令,当用户在 Composer 依赖项或其他基础设施组件更新时访问应用程序,他们有时仍可能遇到错误。这是因为 Laravel 框架的很大一部分必须启动才能确定应用程序处于维护模式并使用模板引擎渲染维护模式视图。
因此,Laravel 允许你预渲染一个维护模式视图,该视图将在请求周期的最开始返回。此视图在加载任何应用程序依赖项之前渲染。你可以使用 down 命令的 render 选项预渲染你选择的模板:
1php artisan down --render="errors::503"
重定向维护模式请求
在维护模式下,Laravel 将为用户尝试访问的所有应用程序 URL 显示维护模式视图。如果你愿意,可以指示 Laravel 将所有请求重定向到特定 URL。这可以使用 redirect 选项实现。例如,你可能希望将所有请求重定向到 / URI:
1php artisan down --redirect=/
禁用维护模式
要禁用维护模式,请使用 up 命令:
1php artisan up
你可以通过在 resources/views/errors/503.blade.php 定义自己的模板来定制默认的维护模式模板。
维护模式与队列
当应用程序处于维护模式时,不会处理任何 队列任务。一旦应用程序退出维护模式,任务将恢复正常处理。
维护模式的替代方案
由于维护模式需要应用程序停机几秒钟,请考虑在像 Laravel Cloud 这样的全托管平台上运行你的应用程序,以实现 Laravel 的零停机部署。