mirror of https://github.com/vapor/docs.git
update cn basics translation part2 (#733)
This commit is contained in:
parent
7e8223c1f8
commit
961d96b6c6
|
|
@ -1,9 +1,8 @@
|
|||
# 环境
|
||||
|
||||
Vapor 的环境API帮助您动态配置您的应用程序。默认情况下,你的应用程序将使用 `development` 环境。你可以定义其他有用的环境,如 `production` 或 `staging`,并在每种情况下改变你的应用是如何配置的。您还可以从进程的环境或 `.Env` (dotenv)文件读取配置取决于您的需要。
|
||||
Vapor 的环境 API 帮助你动态配置你的应用程序。默认情况下,你的应用程序将使用 `development` 环境。你可以定义其他有用的环境,如 `production` 或 `staging`,并在每种情况下改变你的应用是如何配置的。你还可以从进程的环境或 `.Env` (dotenv) 文件读取配置取决于你的需要。
|
||||
|
||||
要访问当前环境,请使用 `app.environment`。你可以在 `configure(_:)` 中通过这个属性来执行不同的配置逻辑。
|
||||
To access the current environment, use `app.environment`. You can switch on this property in `configure(_:)` to execute different configuration logic.
|
||||
|
||||
```swift
|
||||
switch app.environment {
|
||||
|
|
@ -16,7 +15,7 @@ default:
|
|||
|
||||
## 改变环境
|
||||
|
||||
默认情况下,你的应用程序将在 `development` 环境中运行。你可以通过在应用程序引导期间传递`--env` (`-e`)标志来改变这一点。
|
||||
默认情况下,你的应用程序将在 `development` 环境中运行。你可以通过在应用程序引导期间传递 `--env` (`-e`) 标志来改变这一点。
|
||||
|
||||
```swift
|
||||
vapor run serve --env production
|
||||
|
|
@ -24,16 +23,16 @@ vapor run serve --env production
|
|||
|
||||
Vapor 包含下列环境:
|
||||
|
||||
|name|short|description|
|
||||
|名称|缩写|描述|
|
||||
|-|-|-|
|
||||
|production|prod|Deployed to your users.|
|
||||
|development|dev|Local development.|
|
||||
|testing|test|For unit testing.|
|
||||
|production|prod|部署到线上环境。|
|
||||
|development|dev|本地开发环境。|
|
||||
|testing|test|为了单元测试。|
|
||||
|
||||
!!! info "信息"
|
||||
`production` 环境将默认为 `notice` 级别的日志记录,除非另有说明。所有其他环境默认为 `info`。
|
||||
`production` 环境默认为 `notice` 级别的日志记录,除非另有说明。所有其他环境默认为 `info`。
|
||||
|
||||
您可以将全名或短名传递给`--env` (`-e`)标志。
|
||||
你可以将全名或短名传递给`--env` (`-e`) 标志。
|
||||
|
||||
```swift
|
||||
vapor run serve -e prod
|
||||
|
|
@ -41,14 +40,14 @@ vapor run serve -e prod
|
|||
|
||||
## 进程变量
|
||||
|
||||
`Environment` 提供了一个简单的、基于字符串的API来访问进程的环境变量。
|
||||
`Environment` 提供了一个简单的、基于字符串的 API 来访问进程的环境变量。
|
||||
|
||||
```swift
|
||||
let foo = Environment.get("FOO")
|
||||
print(foo) // String?
|
||||
```
|
||||
|
||||
除了 `get` 之外,`Environment` 还通过 `process` 提供了一个动态成员查找API。
|
||||
除了 `get` 之外,`Environment` 还通过 `process` 提供了一个动态成员查找 API。
|
||||
|
||||
```swift
|
||||
let foo = Environment.process.FOO
|
||||
|
|
@ -62,22 +61,21 @@ export FOO=BAR
|
|||
vapor run serve
|
||||
```
|
||||
|
||||
当在Xcode中运行应用程序时,你可以通过编辑 `Run` scheme来设置环境变量。
|
||||
当在 Xcode 中运行应用程序时,你可以通过编辑 `Run` scheme 来设置环境变量。
|
||||
|
||||
## .env (dotenv)
|
||||
|
||||
Dotenv文件包含一个键值对列表,这些键值对将自动加载到环境中。这些文件使配置环境变量变得很容易,而不需要手动设置它们。
|
||||
Dotenv 文件包含一个键值对列表,这些键值对将自动加载到环境中。这些文件使配置环境变量变得很容易,而不需要手动设置它们。
|
||||
|
||||
Vapor 将在当前工作目录中查找dotenv文件。如果你使用Xcode,确保通过编辑 `Run` scheme 设置工作目录。
|
||||
Vapor 将在当前工作目录中查找 `.env` 文件。如果你使用 Xcode,确保通过编辑 `Run` scheme 设置工作目录。
|
||||
|
||||
Assume the following `.env` file placed in your projects root folder:
|
||||
假设以下 `.env` 文件放在你的项目根文件夹中:
|
||||
|
||||
```sh
|
||||
FOO=BAR
|
||||
```
|
||||
|
||||
当您的应用程序启动时,您将能够像访问其他进程环境变量一样访问该文件的内容。
|
||||
当你的应用程序启动时,你将能够像访问其他进程环境变量一样访问该文件的内容。
|
||||
|
||||
```swift
|
||||
let foo = Environment.get("FOO")
|
||||
|
|
@ -87,7 +85,7 @@ print(foo) // String?
|
|||
!!! info "信息"
|
||||
在 `.env` 文件中指定的变量不会覆盖进程环境中已经存在的变量。
|
||||
|
||||
在`.env`旁边,Vapor 还将尝试为当前环境加载一个dotenv文件。例如,在 `development` 环境中,蒸汽将加载 `.env.development`。特定环境文件中的任何值都将优先于 `.env` 文件内的值。
|
||||
除了 `.env`,Vapor 还将尝试为当前环境加载一个 `.env.environment` 文件。例如,在 `development` 环境中,Vapor 将加载 `.env.development`。特定环境文件中的任何值都将优先于 `.env` 文件内的值。
|
||||
|
||||
一个典型的模式是项目包含一个 `.env` 文件作为带有默认值的模板。在 `.gitignore` 中使用以下模式忽略特定的环境文件
|
||||
|
||||
|
|
@ -95,7 +93,7 @@ print(foo) // String?
|
|||
.env.*
|
||||
```
|
||||
|
||||
当项目被 cloned 到新计算机时,已经带有正确的值的`.env`模板可以被复制。
|
||||
当项目被 cloned 到新计算机时,已经带有正确的值的 `.env` 模板可以被复制。
|
||||
|
||||
```sh
|
||||
cp .env .env.development
|
||||
|
|
@ -103,9 +101,9 @@ vim .env.development
|
|||
```
|
||||
|
||||
!!! warning "警告"
|
||||
带有敏感信息(如密码)的Dotenv文件不应提交给版本控制。
|
||||
不应提交包含密码等敏感信息的 `.env` 文件到版本控制。
|
||||
|
||||
如果你在加载dotenv文件时遇到了困难,尝试使用 `--log debug` 来启用调试日志以获取更多信息。
|
||||
如果你在加载 `.env` 文件时遇到了困难,尝试使用 `--log debug` 来启用调试日志以获取更多信息。
|
||||
|
||||
## 自定义环境
|
||||
|
||||
|
|
@ -131,10 +129,10 @@ let app = Application(env)
|
|||
defer { app.shutdown() }
|
||||
```
|
||||
|
||||
`detect` 方法使用进程的命令行参数并自动解析 `--env`标志。您可以通过初始化自定义的 `Environment` 结构来覆盖此行为。
|
||||
`detect` 方法使用进程的命令行参数并自动解析 `--env` 标志。你可以通过初始化自定义的 `Environment` 结构来覆盖此行为。
|
||||
|
||||
```swift
|
||||
let env = Environment(name: "testing", arguments: ["vapor"])
|
||||
```
|
||||
|
||||
参数数组必须包含至少一个表示可执行名称的参数。可以提供进一步的参数来模拟通过命令行传递参数。这对于测试特别有用。
|
||||
参数数组必须包含至少一个表示可执行名称的参数。可以提供更多参数来模拟通过命令行传递参数。这对于测试特别有用。
|
||||
|
|
|
|||
|
|
@ -83,11 +83,11 @@ export LOG_LEVEL=debug
|
|||
vapor run serve
|
||||
```
|
||||
|
||||
这两种方法可以在 Xcode 中编辑 `Run` (scheme)模式进行修改。
|
||||
这两种方法可以在 Xcode 中编辑 `Run`(scheme)模式进行修改。
|
||||
|
||||
## 配置
|
||||
|
||||
`SwiftLog` 可以通过每次进程启动 `LoggingSystem` 时进行配置。Vapor 项目通常在 `main.swift` 执行操作。
|
||||
SwiftLog 可以通过每次进程启动 `LoggingSystem` 时进行配置。Vapor 项目通常在 `main.swift` 执行操作。
|
||||
|
||||
```swift
|
||||
import Vapor
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Validation API
|
||||
|
||||
Vapor 的 **Validation API** 可帮助你在使用 [Content](content.md) API 解码数据之前,对传入的请求进行验证。
|
||||
Vapor 的 **Validation API** 可帮助你在使用 [Content](content.zh.md) API 解码数据之前,对传入的请求进行验证。
|
||||
|
||||
## 介绍
|
||||
|
||||
|
|
@ -9,7 +9,7 @@ Vapor 对 Swift 的类型安全的`可编码`协议进行了深度集成,这
|
|||
|
||||
### 语义可读错误
|
||||
|
||||
如果取得的数据无效,使用 [Content](content.md) API 对其解码将产生错误。但是,这些错误消息有时可能缺乏可读性。例如,采用以下字符串支持的枚举:
|
||||
如果取得的数据无效,使用 [Content](content.zh.md) API 对其解码将产生错误。但是,这些错误消息有时可能缺乏可读性。例如,采用以下字符串支持的枚举:
|
||||
|
||||
```swift
|
||||
enum Color: String, Codable {
|
||||
|
|
@ -17,7 +17,7 @@ enum Color: String, Codable {
|
|||
}
|
||||
```
|
||||
|
||||
如果用户尝试将字符串“purple”传递给“Color”类型的属性,则将收到类似于以下内容的错误:
|
||||
如果用户尝试将字符串 `”purple”` 传递给 `“Color”` 类型的属性,则将收到类似于以下内容的错误:
|
||||
|
||||
```
|
||||
Cannot initialize Color from invalid String value purple for key favoriteColor
|
||||
|
|
@ -64,7 +64,7 @@ app.post("users") { req -> CreateUser in
|
|||
|
||||
### 添加验证
|
||||
|
||||
第一步是在你要解码的类型(在本例中为 CreateUser)继承 **Validatable** 协议并实现 `validations` 静态方法,可在 `extension` 中完成。
|
||||
第一步是在你要解码的类型(在本例中为 `CreateUser`)遵循 `Validatable` 协议并实现 `validations` 静态方法,可在 `extension` 中完成。
|
||||
|
||||
```swift
|
||||
extension CreateUser: Validatable {
|
||||
|
|
@ -74,18 +74,18 @@ extension CreateUser: Validatable {
|
|||
}
|
||||
```
|
||||
|
||||
验证`CreateUser`后,将调用静态方法 `validations(_ :)`。你要执行的所有验证都应添加到 **Validations** 集合中。让我们添加一个简单的验证,以验证用户的电子邮件是否有效。
|
||||
验证 `CreateUser` 后,将调用静态方法 `validations(_ :)`。你要执行的所有验证都应添加到 **Validations** 集合中。让我们添加一个简单的验证,以验证用户的电子邮件是否有效。
|
||||
|
||||
```swift
|
||||
validations.add("email", as: String.self, is: .email)
|
||||
```
|
||||
|
||||
第一个参数是参数值的预期键,在本例中为`email`。这应与正在验证的类型上的属性名称匹配。第二个参数`as`是预期的类型,在这种情况下为`String`。该类型通常与属性的类型匹配。最后,可以在第三个参数`is`之后添加一个或多个验证器。在这种情况下,我们添加一个验证器,以检查该值是否为电子邮件地址。
|
||||
第一个参数是参数值的预期键,在本例中为 `email`。这应与正在验证的类型上的属性名称匹配。第二个参数 `as` 是预期的类型,在这种情况下为 `String`。该类型通常与属性的类型匹配。最后,可以在第三个参数 `is` 之后添加一个或多个验证器。在这种情况下,我们添加一个验证器,以检查该值是否为电子邮件地址。
|
||||
|
||||
|
||||
### 验证请求的 `Content`
|
||||
|
||||
当你的数据类型继承了 **Validatable**,就可以使用 `validate(content:)` 静态方法来验证请求的 `content`。在路由处理程序中 `req.content.decode(CreateUser.self)` 之前添加以下行:
|
||||
当你的数据类型继承了 `Validatable`,就可以使用 `validate(content:)` 静态方法来验证请求的 `content`。在路由处理程序中 `req.content.decode(CreateUser.self)` 之前添加以下行:
|
||||
|
||||
```swift
|
||||
try CreateUser.validate(content: req)
|
||||
|
|
@ -115,14 +115,14 @@ email is not a valid email address
|
|||
|
||||
### 验证请求的 `Query`
|
||||
|
||||
当你的数据类型继承了 **Validatable**,就可以使用 `validate(query:)` 静态方法来验证请求的 `query`。在路由处理程序中添加以下行:
|
||||
当你的数据类型继承了 `Validatable`,就可以使用 `validate(query:)` 静态方法来验证请求的 `query`。在路由处理程序中添加以下行:
|
||||
|
||||
```swift
|
||||
try CreateUser.validate(query: req)
|
||||
req.query.decode(CreateUser.self)
|
||||
```
|
||||
|
||||
现在,尝试发送一下包含错误的 email 在 query 的请求。
|
||||
现在,尝试发送以下请求,该请求在查询字符串中包含无效的电子邮件。
|
||||
|
||||
```http
|
||||
GET /users?age=4&email=foo&favoriteColor=green&name=Foo&username=foo HTTP/1.1
|
||||
|
|
@ -150,7 +150,7 @@ age is less than minimum of 13, email is not a valid email address
|
|||
|
||||
### 字符串验证
|
||||
|
||||
接下来,让我们添加对“名称”和“用户名”的验证。
|
||||
接下来,让我们添加对 `name` 和 `username` 的验证。
|
||||
|
||||
```swift
|
||||
validations.add("name", as: String.self, is: !.empty)
|
||||
|
|
@ -159,26 +159,51 @@ validations.add("username", as: String.self, is: .count(3...) && .alphanumeric)
|
|||
|
||||
|
||||
名称验证使用 `!` 运算符将 `.empty` 验证反转。这要求该字符串不为空。
|
||||
用户名验证使用`&&`组合了两个验证器。这将要求该字符串的长度至少为3个字符,并且使用 && 来包含字母数字字符。
|
||||
|
||||
用户名验证使用`&&`组合了两个验证器。这将要求该字符串的长度至少为3个字符,并且仅包含字母数字字符。
|
||||
|
||||
### 枚举验证
|
||||
|
||||
最后,让我们看一下更高级的验证,以检查提供的`favoriteColor`是否有效:
|
||||
最后,让我们看一下更高级的验证,以检查提供的 `favoriteColor` 是否有效:
|
||||
|
||||
```swift
|
||||
validations.add("favoriteColor", as: String.self,is: .in("red", "blue","green"),required: false)
|
||||
|
||||
validations.add(
|
||||
"favoriteColor", as: String.self,
|
||||
is: .in("red", "blue","green"),
|
||||
required: false
|
||||
)
|
||||
```
|
||||
|
||||
由于无法从无效值中解码“颜色”,因此此验证将“字符串”用作基本类型。它使用 .in 验证器来验证该值是有效的选项:红色、蓝色或绿色。由于该值是可选的,因此将`required`设置为 false 表示如果请求数据中缺少此字段,则验证不会失败。
|
||||
由于无法从无效值中解码 `Color`,因此此验证将 `String` 用作基本类型。它使用 `.in` 验证器来验证该值是有效的选项:红色、蓝色或绿色。由于该值是可选的,因此将 `required` 设置为 false 表示如果请求数据中缺少此字段,则验证不会失败。
|
||||
|
||||
请注意,如果缺少此字段,则收藏夹颜色验证将通过,但如果提供 `null`,则不会通过。 如果要支持`null`,请将验证类型更改为`String?`,并使用 `.nil ||`。
|
||||
请注意,如果缺少此字段,则收藏夹颜色验证将通过,但如果提供 `null`,则不会通过。 如果要支持 `null`,请将验证类型更改为 `String?`,并使用 `.nil ||`。
|
||||
|
||||
```swift
|
||||
validations.add("favoriteColor", as: String?.self,is: .nil || .in("red", "blue", "green"),required: false)
|
||||
validations.add(
|
||||
"favoriteColor", as: String?.self,
|
||||
is: .nil || .in("red", "blue", "green"),
|
||||
required: false
|
||||
)
|
||||
```
|
||||
|
||||
### 自定义错误
|
||||
|
||||
你可能希望将自定义的可读错误添加到你的 `Validations` 或者 `Validator`。为此,只需添加 `customFailureDescription` 参数,该参数将覆盖默认错误信息。
|
||||
|
||||
```swift
|
||||
validations.add(
|
||||
"name",
|
||||
as: String.self,
|
||||
is: !.empty,
|
||||
customFailureDescription: "Provided name is empty!"
|
||||
)
|
||||
validations.add(
|
||||
"username",
|
||||
as: String.self,
|
||||
is: .count(3...) && .alphanumeric,
|
||||
customFailureDescription: "Provided username is invalid!"
|
||||
)
|
||||
```
|
||||
|
||||
## 验证器
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue