mirror of https://github.com/vapor/docs.git
Fix Japanese heading anchors for cross-language navigation consistency
- Add explicit anchors to Japanese headings to match English auto-generated anchors - Remove unnecessary anchors from pure English headings in Japanese files - Delete Stack Traces section from errors.ja.md to match English structure - Ensure all heading anchors match between English and Japanese versions - All Playwright cross-language navigation tests now pass 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
072f2d659b
commit
44665d450e
|
|
@ -66,7 +66,7 @@ app.http.server.configuration.backlog = 128
|
|||
app.http.server.configuration.reuseAddress = false
|
||||
```
|
||||
|
||||
### TCP No Delay {#tcp-no-delay}
|
||||
### TCP No Delay
|
||||
|
||||
`tcpNoDelay`パラメーターを有効にすると、TCPパケットの遅延を最小限に抑えようとします。デフォルトは`true`です。
|
||||
|
||||
|
|
@ -132,7 +132,7 @@ app.http.server.configuration.supportPipelining = true
|
|||
app.http.server.configuration.supportVersions = [.two]
|
||||
```
|
||||
|
||||
### TLS {#tls}
|
||||
### TLS
|
||||
|
||||
`tlsConfiguration`パラメーターは、サーバーでTLS(SSL)が有効かどうかを制御します。デフォルトは`nil`です。
|
||||
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ app.sessions.use(.memory)
|
|||
|
||||
本番環境での使用例については、データベースを使用してアプリの複数のインスタンス間でセッションを永続化および共有する他のセッションドライバーを確認してください。
|
||||
|
||||
### Fluent {#fluent}
|
||||
### Fluent
|
||||
|
||||
Fluentには、アプリケーションのデータベースにセッションデータを保存するサポートが含まれています。このセクションでは、[Fluentを設定](../fluent/overview.md)し、データベースに接続できることを前提としています。最初のステップは、Fluentセッションドライバーを有効にすることです。
|
||||
|
||||
|
|
@ -75,7 +75,7 @@ app.migrations.add(SessionRecord.migration)
|
|||
|
||||
新しいマイグレーションを追加した後、必ずアプリケーションのマイグレーションを実行してください。セッションはアプリケーションのデータベースに保存されるようになり、再起動間で永続化され、アプリの複数のインスタンス間で共有できます。
|
||||
|
||||
### Redis {#redis}
|
||||
### Redis
|
||||
|
||||
Redisは、設定されたRedisインスタンスにセッションデータを保存するサポートを提供します。このセクションでは、[Redisを設定](../redis/overview.md)し、Redisインスタンスにコマンドを送信できることを前提としています。
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# テスト {#testing}
|
||||
|
||||
## VaporTesting {#vaportesting}
|
||||
## VaporTesting
|
||||
|
||||
Vaporには`VaporTesting`というモジュールが含まれており、`Swift Testing`をベースとしたテストヘルパーを提供しています。これらのテストヘルパーを使用すると、Vaporアプリケーションにプログラムでテストリクエストを送信したり、HTTPサーバー経由で実行したりできます。
|
||||
|
||||
|
|
@ -162,7 +162,7 @@ private func withApp(_ test: (Application) async throws -> ()) async throws {
|
|||
}
|
||||
```
|
||||
|
||||
## XCTVapor {#xctvapor}
|
||||
## XCTVapor
|
||||
|
||||
Vaporには`XCTVapor`というモジュールが含まれており、`XCTest`をベースとしたテストヘルパーを提供しています。これらのテストヘルパーを使用すると、Vaporアプリケーションにプログラムでテストリクエストを送信したり、HTTPサーバー経由で実行したりできます。
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ Vaporのトレーシング APIは[swift-distributed-tracing](https://github.com/
|
|||
|
||||
Swiftでのトレーシングとスパンに馴染みがない場合は、[OpenTelemetryトレースドキュメント](https://opentelemetry.io/ja/docs/concepts/signals/traces/)と[swift-distributed-tracingドキュメント](https://swiftpackageindex.com/apple/swift-distributed-tracing/main/documentation/tracing)を確認してください。
|
||||
|
||||
## TracingMiddleware {#tracingmiddleware}
|
||||
## TracingMiddleware
|
||||
|
||||
各リクエストに対して完全に注釈付きのスパンを自動的に作成するには、アプリケーションに`TracingMiddleware`を追加します。
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# 非同期
|
||||
# 非同期 {#async}
|
||||
|
||||
## Async Await
|
||||
|
||||
|
|
@ -8,7 +8,7 @@ Vaporは、低レベルの非同期プログラミングのためのプリミテ
|
|||
|
||||
VaporのAPIの多くは、`EventLoopFuture`と`async`/`await`の両方のバージョンを提供するようになり、どちらが最適かを選択できるようになりました。一般的には、1つのルートハンドラーにつき1つのプログラミングモデルのみを使用し、コードの中で混在させないようにすべきです。イベントループを明示的に制御する必要があるアプリケーションや、非常に高性能が求められるアプリケーションについては、カスタムエグゼキュータが実装されるまで`EventLoopFuture`を使用し続けるべきです。それ以外の人々には、読みやすさや保守性の利点が小さなパフォーマンスのペナルティをはるかに上回るため、`async`/`await`を使用すべきです。
|
||||
|
||||
### async/awaitへの移行
|
||||
### async/awaitへの移行 {#migrating-to-asyncawait}
|
||||
|
||||
async/awaitに移行するにはいくつかのステップが必要です。まず、macOSを使用している場合は、macOS 12 Monterey以降とXcode 13.1以降が必要です。他のプラットフォームでは、Swift 5.5以降を実行している必要があります。次に、すべての依存関係を更新したことを確認してください。
|
||||
|
||||
|
|
@ -71,7 +71,7 @@ routes.get("firstUser") { req async throws -> String in
|
|||
}
|
||||
```
|
||||
|
||||
### 古い API と新しい API の使用
|
||||
### 古い API と新しい API の使用 {#working-with-old-and-new-apis}
|
||||
|
||||
まだ `async`/`await` バージョンを提供していない API に遭遇した場合は、`EventLoopFuture` を返す関数に `.get()` を呼び出して変換することができます。
|
||||
|
||||
|
|
@ -108,7 +108,7 @@ let futureString: EventLoopFuture<String> = promise.futureResult
|
|||
|
||||
に変換できます。
|
||||
|
||||
## `EventLoopFuture`
|
||||
## `EventLoopFuture` {#eventloopfutures}
|
||||
|
||||
Vapor のいくつかの API が一般的な `EventLoopFuture` タイプを期待したり返したりすることに気づいたかもしれません。もしこれが futures について初めて聞いたのであれば、最初は少し混乱するかもしれません。しかし心配しないでください、このガイドは彼らの強力な API を利用する方法をお見せします。
|
||||
|
||||
|
|
@ -121,7 +121,7 @@ Vapor のいくつかの API が一般的な `EventLoopFuture` タイプを期
|
|||
|
||||
フューチャーは、コールバックベースの非同期 API への代替手段です。フューチャーは、単純なクロージャではできない方法で連鎖させたり変換したりすることができます。
|
||||
|
||||
## 変換
|
||||
## 変換 {#transforming}
|
||||
|
||||
Swiftのオプショナルや配列のように、フューチャーはマップやフラットマップで変換できます。これらは、フューチャーに対して行う最も一般的な操作です。
|
||||
|
||||
|
|
@ -235,7 +235,7 @@ print(futureStatus) // EventLoopFuture<HTTPStatus>
|
|||
|
||||
`transform` に既に利用可能な値を提供しているとしても、これはまだ_変換_です。前のフューチャーが完了する(または失敗する)まで、フューチャーは完了しません。
|
||||
|
||||
### Chaining
|
||||
### チェーン {#chaining}
|
||||
|
||||
フューチャーの変換の素晴らしい点は、それらがチェーンできることです。これにより、多くの変換やサブタスクを簡単に表現できます。
|
||||
|
||||
|
|
@ -361,7 +361,7 @@ promiseString.fail(...)
|
|||
|
||||
約束はどのスレッドからでも完了(`succeed` / `fail`)できます。これが、初期化にイベントループが必要な理由です。約束は、完了アクションがそのイベントループに戻されて実行されることを保証します。
|
||||
|
||||
## イベントループ
|
||||
## イベントループ {#event-loop}
|
||||
|
||||
アプリケーションが起動すると、通常は実行中の CPU の各コアに対して1つのイベントループが作成されます。各イベントループには1つのスレッドがあります。Node.js からのイベントループに精通している場合、Vapor のものは似ています。主な違いは、Swift がマルチスレッディングをサポートしているため、Vapor は 1 つのプロセスで複数のイベントループを実行できることです。
|
||||
|
||||
|
|
@ -427,7 +427,7 @@ app.get("hello") { req -> EventLoopFuture<String> in
|
|||
|
||||
すべてのブロッキングコールが `sleep(_:)` ほど明白ではありません。使用している呼び出しがブロッキングかどうか疑わしい場合は、そのメソッド自体を調査するか、誰かに尋ねてください。以下のセクションでは、メソッドがどのようにブロッキングする可能性があるかについて、詳しく説明します。
|
||||
|
||||
### I/O バウンド
|
||||
### I/O バウンド {#io-bound}
|
||||
|
||||
I/O バウンドのブロッキングとは、ネットワークやハードディスクなど、CPU よりも桁違いに遅いリソースを待つことを意味します。これらのリソースを待っている間に CPU をブロックすると、時間が無駄になります。
|
||||
|
||||
|
|
@ -436,7 +436,7 @@ I/O バウンドのブロッキングとは、ネットワークやハードデ
|
|||
|
||||
Vapor のすべてのパッケージは SwiftNIO に基づいており、ノンブロッキング I/O を使用しています。しかし、ブロッキング I/O を使用する Swift のパッケージや C ライブラリが多く存在します。関数がディスクやネットワーク IO を行っており、同期 API(コールバックやフューチャーがない)を使用している場合、ブロッキングしている可能性が高いです。
|
||||
|
||||
### CPU バウンド
|
||||
### CPU バウンド {#cpu-bound}
|
||||
|
||||
リクエスト中のほとんどの時間は、データベースのクエリやネットワークリクエストなどの外部リソースを待っているために費やされます。Vapor と SwiftNIO はノンブロッキングなので、このダウンタイムは他の受信リクエストを満たすために使用できます。しかし、アプリケーションのいくつかのルートは、リクエストの結果として重い CPU バウンド作業を行う必要があるかもしれません。
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
# クライアント
|
||||
# クライアント {#client}
|
||||
|
||||
Vapor のクライアント API では、外部のリソースに対して HTTP 通信を行うことができます。これは [async-http-client](https://github.com/swift-server/async-http-client) に基づいており、[コンテンツ](content.ja.md) API と統合されています。
|
||||
|
||||
## 概要
|
||||
## 概要 {#overview}
|
||||
|
||||
`Application` やルートハンドラー内の `Request` から、デフォルトクライアントにアクセスできます。
|
||||
|
||||
|
|
@ -16,7 +16,7 @@ app.get("test") { req in
|
|||
|
||||
アプリケーションのクライアントは、設定時に HTTP リクエストを送る際に便利です。ルートハンドラー内で HTTP リクエストを行う場合は、リクエストに紐づくクライアントを使うべきです。
|
||||
|
||||
### メソッド
|
||||
### メソッド {#methods}
|
||||
|
||||
`GET` リクエストを行う際には、目的の URL を `get` メソッドに渡します。
|
||||
|
||||
|
|
@ -26,7 +26,7 @@ let response = try await req.client.get("https://httpbin.org/status/200")
|
|||
|
||||
`get`、`post`、`delete` など、各種 HTTP メソッドに対応したメソッドがあります。クライアントからのレスポンスはFutureとして返され、HTTPステータス、ヘッダー、ボディが含まれます。
|
||||
|
||||
### コンテンツ
|
||||
### コンテンツ {#content}
|
||||
|
||||
Vapor の [コンテンツ](content.ja.md) を使うと、クライアントリクエストやレスポンスのデータを扱うことができます。コンテンツやクエリパラメータをエンコードしたり、ヘッダーを追加するには、`beforeSend` クロージャを使います。
|
||||
|
||||
|
|
@ -62,7 +62,7 @@ return req.client.get("https://httpbin.org/json").flatMapThrowing { res in
|
|||
}
|
||||
```
|
||||
|
||||
## 設定
|
||||
## 設定 {#configuration}
|
||||
|
||||
アプリケーションを通じて、基本となる HTTP クライアントを設定することができます。
|
||||
|
||||
|
|
|
|||
|
|
@ -193,7 +193,7 @@ let hello = try req.content.decode(Hello.self, using: decoder)
|
|||
|
||||
アプリケーションやサードパーティのパッケージは、Vapor がデフォルトでサポートしていないメディアタイプに対応するためにカスタムコーダーを作成することができます。
|
||||
|
||||
### Content {#content}
|
||||
### Content
|
||||
|
||||
Vapor は、HTTP メッセージボディのコンテンツを処理するためのコーダーのために、`ContentDecoder` と `ContentEncoder` の2つのプロトコルを指定しています。
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
# コントローラー
|
||||
# コントローラー {#controllers}
|
||||
|
||||
コントローラーはコードを整理するのに適した方法です。これらは、リクエストを受けてレスポンスを返すメソッドの集まりです。
|
||||
|
||||
コントローラーを置く良い場所は、[Controllers](../getting-started/folder-structure.ja.md#controllers) フォルダーです。
|
||||
|
||||
## 概要
|
||||
## 概要 {#overview}
|
||||
|
||||
例としてコントローラーを見てみましょう。
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# 環境
|
||||
# 環境 {#environment}
|
||||
|
||||
VaporのEnvironment APIは、アプリの動的な設定を支援します。デフォルトでは、あなたのアプリは`development`環境を使用します。`production`や`staging`のような他の有用な環境を定義し、各ケースでアプリがどのように設定されるかを変更できます。また、プロセスの環境や`.env`(dotenv)ファイルから変数を読み込むことも、ニーズに応じて可能です。
|
||||
|
||||
|
|
@ -13,7 +13,7 @@ default:
|
|||
}
|
||||
```
|
||||
|
||||
## 環境の変化
|
||||
## 環境の変化 {#changing-environment}
|
||||
|
||||
デフォルトでは、アプリは `development` 環境で実行されます。アプリ起動時に `--env`(`-e`)フラグを渡すことで、これを変更できます。
|
||||
|
||||
|
|
@ -39,7 +39,7 @@ Vapor は以下の環境を含みます。:
|
|||
swift run App serve -e prod
|
||||
```
|
||||
|
||||
## プロセス変数
|
||||
## プロセス変数 {#process-variables}
|
||||
|
||||
`Environment` は、プロセスの環境変数にアクセスするためのシンプルな文字列ベースの API を提供します。
|
||||
|
||||
|
|
@ -64,7 +64,7 @@ swift run App serve
|
|||
|
||||
Xcode でアプリを実行する場合は、`App` スキームを編集して環境変数を設定できます。
|
||||
|
||||
## .env (dotenv)
|
||||
## .env (dotenv) {#env-dotenv}
|
||||
|
||||
Dotenv ファイルには、環境に自動的にロードされるキーと値のペアのリストが含まれています。これらのファイルは、手動で設定することなく環境変数を設定するのを容易にします。
|
||||
|
||||
|
|
@ -107,7 +107,7 @@ vim .env.development
|
|||
|
||||
dotenv ファイルの読み込みに問題がある場合は、`--log debug` を使用してデバッグログを有効にすると、より多くの情報が得られます。
|
||||
|
||||
## カスタム環境
|
||||
## カスタム環境 {#custom-environments}
|
||||
|
||||
カスタム環境を定義するには、`Environment`を拡張します。
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# エラー
|
||||
# エラー {#errors}
|
||||
|
||||
Vapor は Swift の `Error` プロトコルをベースにしたエラー処理を採用しています。ルートハンドラは、エラーを `throw` するか、失敗した `EventLoopFuture` を返すことができます。Swiftの `Error` を throw するか返すと、`500` ステータスのレスポンスが生成され、エラーがログに記録されます。`AbortError` と `DebuggableError` は、それぞれ結果として得られるレスポンスとログを変更するために使用できます。エラーの処理は `ErrorMiddleware` によって行われます。このミドルウェアはデフォルトでアプリケーションに追加されており、必要に応じてカスタムロジックに置き換えることができます。
|
||||
|
||||
|
|
@ -136,52 +136,8 @@ struct MyError: DebuggableError {
|
|||
|
||||
`DebuggableError` には、エラーのデバッグ性を向上させるために使用できる `possibleCauses` や `suggestedFixes` など、他にもいくつかのプロパティがあります。より詳細に知りたい場合は、プロトコル自体をご覧ください。
|
||||
|
||||
## スタックトレース
|
||||
|
||||
Vaporは、通常のSwiftエラーやクラッシュに対するスタックトレースの表示をサポートしています。
|
||||
|
||||
### Swift バックトレース
|
||||
|
||||
Vapor は、Linux 上で致命的なエラーやアサーションの後にスタックトレースを提供するために、[SwiftBacktrace](https://github.com/swift-server/swift-backtrace) ライブラリを使用しています。これが機能するためには、アプリはコンパイル中にデバッグシンボルを含める必要があります。
|
||||
|
||||
```sh
|
||||
swift build -c release -Xswiftc -g
|
||||
```
|
||||
|
||||
### エラートレース
|
||||
|
||||
デフォルトでは、`Abort` は初期化されたときに現在のスタックトレースをキャプチャします。カスタムエラータイプは、`DebuggableError` に準拠し、`StackTrace.capture()` を保存することでこれを実現できます。
|
||||
|
||||
```swift
|
||||
import Vapor
|
||||
|
||||
struct MyError: DebuggableError {
|
||||
var identifier: String
|
||||
var reason: String
|
||||
var stackTrace: StackTrace?
|
||||
|
||||
init(
|
||||
identifier: String,
|
||||
reason: String,
|
||||
stackTrace: StackTrace? = .capture()
|
||||
) {
|
||||
self.identifier = identifier
|
||||
self.reason = reason
|
||||
self.stackTrace = stackTrace
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
アプリケーションの[ログレベル](logging.ja.md#level)が `.debug` 以下に設定されている場合、エラースタックトレースはログ出力に含まれます。
|
||||
|
||||
ログレベルが `.debug` より大きい場合、スタックトレースはキャプチャされません。この挙動を変更するには、`configure` 内で `StackTrace.isCaptureEnabled` を手動で設定してください。
|
||||
|
||||
```swift
|
||||
// Always capture stack traces, regardless of log level.
|
||||
StackTrace.isCaptureEnabled = true
|
||||
```
|
||||
|
||||
## エラーミドルウェア
|
||||
## エラーミドルウェア {#error-middleware}
|
||||
|
||||
`ErrorMiddleware` は、デフォルトでアプリケーションに追加される唯一のミドルウェアです。このミドルウェアは、ルートハンドラーによって投げられたり返されたりした Swift のエラーを HTTP レスポンスに変換します。このミドルウェアがない場合、投げられたエラーは応答なしに接続が閉じられることになります。
|
||||
|
||||
|
|
|
|||
|
|
@ -235,7 +235,7 @@ validations.add(
|
|||
|
||||
カスタムバリデーターを作成する方法は2つあります。
|
||||
|
||||
### Extending Validation API {#extending-validation-api}
|
||||
### Validation APIの拡張 {#extending-validation-api}
|
||||
|
||||
郵便番号のカスタムバリデーターを作成することで、バリデーションフレームワークの機能を拡張できます。このセクションでは、郵便番号を検証するカスタムバリデーターを作成する手順を説明します。
|
||||
|
||||
|
|
|
|||
|
|
@ -175,10 +175,10 @@ DigitalOcean DropletでVaporアプリが実行できたことをおめでとう
|
|||
|
||||
このガイドの残りの部分では、デプロイメントを改善するための追加リソースを紹介します。
|
||||
|
||||
### Supervisor {#supervisor}
|
||||
### Supervisor
|
||||
|
||||
Supervisorは、Vapor実行ファイルを実行および監視できるプロセス制御システムです。Supervisorを設定すると、サーバーの起動時にアプリが自動的に開始され、クラッシュした場合に再起動されます。[Supervisor](../deploy/supervisor.md)について詳しく学びましょう。
|
||||
|
||||
### Nginx {#nginx}
|
||||
### Nginx
|
||||
|
||||
Nginxは、極めて高速で、実戦で証明されており、設定が簡単なHTTPサーバーおよびプロキシです。VaporはHTTPリクエストを直接処理することをサポートしていますが、Nginxの背後でプロキシすることで、パフォーマンス、セキュリティ、使いやすさが向上します。[Nginx](../deploy/nginx.md)について詳しく学びましょう。
|
||||
|
|
@ -10,7 +10,7 @@ Herokuアカウントが必要です。まだお持ちでない場合は、こ
|
|||
|
||||
Heroku CLIツールがインストールされていることを確認してください。
|
||||
|
||||
### HomeBrew {#homebrew}
|
||||
### HomeBrew
|
||||
|
||||
```bash
|
||||
brew tap heroku/brew && brew install heroku
|
||||
|
|
@ -38,7 +38,7 @@ heroku auth:whoami
|
|||
|
||||
dashboard.heroku.comにアクセスしてアカウントにログインし、右上のドロップダウンから新しいアプリケーションを作成します。Herokuはリージョンやアプリケーション名などいくつかの質問をしますので、プロンプトに従ってください。
|
||||
|
||||
### Git {#git}
|
||||
### Git
|
||||
|
||||
HerokuはGitを使用してアプリをデプロイするため、プロジェクトをGitリポジトリに配置する必要があります(まだの場合)。
|
||||
|
||||
|
|
@ -118,7 +118,7 @@ echo "5.8.1" > .swift-version
|
|||
|
||||
これにより、`5.8.1`を内容とする**.swift-version**が作成されます。
|
||||
|
||||
### Procfile {#procfile}
|
||||
### Procfile
|
||||
|
||||
Herokuはアプリの実行方法を知るために**Procfile**を使用します。私たちの場合、次のようになります:
|
||||
|
||||
|
|
@ -164,7 +164,7 @@ heroku ps:scale web=1
|
|||
|
||||
更新したい場合は、最新の変更をmainに取り込んでHerokuにプッシュするだけで、再デプロイされます。
|
||||
|
||||
## Postgres {#postgres}
|
||||
## Postgres
|
||||
|
||||
### PostgreSQLデータベースの追加 {#add-postgresql-database}
|
||||
|
||||
|
|
|
|||
|
|
@ -344,7 +344,7 @@ User.query(on: database).filter(\.$pet.$name == "Zizek").all()
|
|||
|1|Tanner|Zizek|Cat|
|
||||
|2|Logan|Runa|Dog|
|
||||
|
||||
## Codable {#codable}
|
||||
## Codable
|
||||
|
||||
モデルはデフォルトで`Codable`に準拠しています。つまり、`Content`プロトコルへの準拠を追加することで、モデルをVaporの[コンテンツAPI](../basics/content.md)で使用できます。
|
||||
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ database.query(Planet.self)
|
|||
!!! note
|
||||
クエリを含むファイルで`import Fluent`を行う必要があります。これにより、コンパイラがFluentのヘルパー関数を認識できるようになります。
|
||||
|
||||
## All {#all}
|
||||
## All
|
||||
|
||||
`all()`メソッドはモデルの配列を返します。
|
||||
|
||||
|
|
@ -37,7 +37,7 @@ let planets = try await Planet.query(on: database).all()
|
|||
let names = try await Planet.query(on: database).all(\.$name)
|
||||
```
|
||||
|
||||
### First {#first}
|
||||
### First
|
||||
|
||||
`first()`メソッドは、単一のオプショナルなモデルを返します。クエリが複数のモデルを返す場合、最初のものだけが返されます。クエリ結果がない場合は、`nil`が返されます。
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ Fluent の [model API](model.md) は、リレーションを通じてモデル
|
|||
- [Parent](#parent) / [Children](#children)(1対多)
|
||||
- [Siblings](#siblings)(多対多)
|
||||
|
||||
## Parent {#parent}
|
||||
## Parent
|
||||
|
||||
`@Parent` リレーションは、別のモデルの `@ID` プロパティへの参照を保存します。
|
||||
|
||||
|
|
@ -43,7 +43,7 @@ init(name: String, starID: Star.IDValue) {
|
|||
|
||||
[`.references`](schema.md#field-constraint) 制約はオプションであることに注意してください。詳細については [schema](schema.md) を参照してください。
|
||||
|
||||
### Optional Parent {#optional-parent}
|
||||
### Optional Parent
|
||||
|
||||
`@OptionalParent` リレーションは、別のモデルの `@ID` プロパティへのオプショナルな参照を保存します。`@Parent` と同様に動作しますが、リレーションが `nil` になることを許可します。
|
||||
|
||||
|
|
@ -94,7 +94,7 @@ try await planet.create(on: req.db)
|
|||
|
||||
同じことがクライアントにモデルを返す際にも適用されます。クライアントはネストされた構造を処理できる必要があるか、返す前にモデルを DTO に変換する必要があります。DTO の詳細については、[Model ドキュメント](model.md#data-transfer-object) を参照してください。
|
||||
|
||||
## Optional Child {#optional-child}
|
||||
## Optional Child
|
||||
|
||||
`@OptionalChild` プロパティは、2つのモデル間に1対1のリレーションを作成します。ルートモデルには値を保存しません。
|
||||
|
||||
|
|
@ -135,7 +135,7 @@ try await database.schema(Governor.schema)
|
|||
クライアントのスキーマから親 ID フィールドのユニーク制約を省略すると、予測できない結果につながる可能性があります。
|
||||
一意性制約がない場合、子テーブルには任意の親に対して複数の子行が含まれる可能性があります。この場合、`@OptionalChild` プロパティは一度に1つの子にしかアクセスできず、どの子が読み込まれるかを制御する方法がありません。任意の親に対して複数の子行を保存する必要がある場合は、代わりに `@Children` を使用してください。
|
||||
|
||||
## Children {#children}
|
||||
## Children
|
||||
|
||||
`@Children` プロパティは、2つのモデル間に1対多のリレーションを作成します。ルートモデルには値を保存しません。
|
||||
|
||||
|
|
@ -161,7 +161,7 @@ try await sun.$planets.create(earth, on: database)
|
|||
|
||||
このリレーションは値を保存しないため、データベーススキーマエントリは必要ありません。
|
||||
|
||||
## Siblings {#siblings}
|
||||
## Siblings
|
||||
|
||||
`@Siblings` プロパティは、2つのモデル間に多対多のリレーションを作成します。これはピボットと呼ばれる第3のモデルを通じて行われます。
|
||||
|
||||
|
|
@ -281,7 +281,7 @@ try await earth.$tags.detach(inhabited, on: database)
|
|||
earth.$tags.isAttached(to: inhabited)
|
||||
```
|
||||
|
||||
## Get {#get}
|
||||
## Get
|
||||
|
||||
`get(on:)` メソッドを使用して、リレーションの値を取得します。
|
||||
|
||||
|
|
@ -303,7 +303,7 @@ print(planets)
|
|||
try await sun.$planets.get(reload: true, on: database)
|
||||
```
|
||||
|
||||
## Query {#query}
|
||||
## Query
|
||||
|
||||
リレーションで `query(on:)` メソッドを使用して、関連モデルのクエリビルダーを作成します。
|
||||
|
||||
|
|
@ -314,7 +314,7 @@ try await sun.$planets.query(on: database).filter(\.$name =~ "M").all()
|
|||
|
||||
詳細については [query](query.md) を参照してください。
|
||||
|
||||
## Eager Loading {#eager-loading}
|
||||
## Eager Loading
|
||||
|
||||
Fluent のクエリビルダーを使用すると、モデルがデータベースから取得されるときにリレーションを事前に読み込むことができます。これは eager loading と呼ばれ、最初に [`get`](#get) を呼び出す必要なく、リレーションに同期的にアクセスできるようになります。
|
||||
|
||||
|
|
@ -361,7 +361,7 @@ for planet in planets {
|
|||
|
||||
`with` メソッドは、2番目のパラメータとしてオプションのクロージャを受け取ります。このクロージャは、選択されたリレーションの eager load ビルダーを受け取ります。eager loading のネストの深さに制限はありません。
|
||||
|
||||
## Lazy Eager Loading {#lazy-eager-loading}
|
||||
## Lazy Eager Loading
|
||||
|
||||
親モデルをすでに取得していて、そのリレーションの1つを読み込みたい場合は、その目的で `get(reload:on:)` メソッドを使用できます。これにより、関連モデルがデータベース(または利用可能な場合はキャッシュ)から取得され、ローカルプロパティとしてアクセスできるようになります。
|
||||
|
||||
|
|
|
|||
|
|
@ -218,7 +218,7 @@ Fluentはデフォルトでユニーク制約名を生成します。ただし
|
|||
外部キーアクションはデータベース内でのみ発生し、Fluentをバイパスします。
|
||||
これは、モデルミドルウェアや論理削除などが正しく動作しない可能性があることを意味します。
|
||||
|
||||
## SQL {#sql}
|
||||
## SQL
|
||||
|
||||
`.sql`パラメータを使用すると、スキーマに任意のSQLを追加できます。これは、特定の制約やデータ型を追加するのに役立ちます。
|
||||
一般的な使用例は、フィールドのデフォルト値を定義することです:
|
||||
|
|
@ -233,7 +233,7 @@ Fluentはデフォルトでユニーク制約名を生成します。ただし
|
|||
.field("created_at", .datetime, .required, .sql(.default(SQLFunction("now"))))
|
||||
```
|
||||
|
||||
## Dictionary {#dictionary}
|
||||
## Dictionary
|
||||
|
||||
dictionary データ型は、ネストされた辞書値を格納できます。これには、`Codable`に準拠する構造体と、`Codable`値を持つSwift辞書が含まれます。
|
||||
|
||||
|
|
@ -272,7 +272,7 @@ var pet: Pet
|
|||
|
||||
辞書のキーは常に文字列である必要があります。
|
||||
|
||||
## Array {#array}
|
||||
## Array
|
||||
|
||||
array データ型は、ネストされた配列を格納できます。これには、`Codable`値を含むSwift配列と、キーなしコンテナを使用する`Codable`型が含まれます。
|
||||
|
||||
|
|
@ -293,7 +293,7 @@ var tags: [String]
|
|||
|
||||
Codable Swiftの`Array`は常に同種の値型を持ちます。異種の値をキーなしコンテナにシリアライズするカスタム`Codable`型は例外であり、`.array`データ型を使用する必要があります。
|
||||
|
||||
## Enum {#enum}
|
||||
## Enum
|
||||
|
||||
enum データ型は、文字列ベースのSwift enumをネイティブに格納できます。ネイティブデータベースenumは、データベースに型安全性の追加レイヤーを提供し、生のenumよりもパフォーマンスが高い場合があります。
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# フォルダ構造
|
||||
# フォルダ構造 {#folder-structure}
|
||||
|
||||
あなたの初めての Vapor アプリを作成し、ビルドし、実行したので、Vapor のフォルダ構造に慣れるための時間を取りましょう。この構造は、[SPM](spm.ja.md) のフォルダ構造に基づいていますので、以前に SPM を使ったことがあれば、見慣れているはずです。
|
||||
|
||||
|
|
@ -56,15 +56,15 @@ Migrations フォルダは、Fluent を使用している場合、データベ
|
|||
|
||||
Models フォルダは、`Content` 構造体や Fluent の `Model` を保存するのに適しています。
|
||||
|
||||
#### configure.swift
|
||||
#### configure.swift {#configureswift}
|
||||
|
||||
このファイルには、`configure(_:)` 関数が含まれています。このメソッドは、新しく作成された `Application` を設定するために `entrypoint.swift` から呼び出されます。ここで、ルート、データベース、プロバイダなどのサービスの登録をする必要があります。
|
||||
|
||||
#### entrypoint.swift
|
||||
#### entrypoint.swift {#entrypointswift}
|
||||
|
||||
このファイルには、Vapor アプリケーションの設定と実行を行うアプリケーションの `@main` エントリーポイントが含まれています。
|
||||
|
||||
#### routes.swift
|
||||
#### routes.swift {#routesswift}
|
||||
|
||||
このファイルには、`routes(_:)` 関数が含まれています。このメソッドは、`Application` へのルートを登録するために、`configure(_:)` の終わり近くで呼び出されます。
|
||||
|
||||
|
|
@ -76,6 +76,6 @@ Models フォルダは、`Content` 構造体や Fluent の `Model` を保存す
|
|||
|
||||
このフォルダには、`App` モジュールのコードの単体テストが含まれています。
|
||||
|
||||
## Package.swift
|
||||
## Package.swift {#packageswift}
|
||||
|
||||
最後に、[SPM](spm.ja.md) のパッケージマニフェストがあります。
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
!!! tip
|
||||
Vapor ツールボックスで使用されるテンプレートには Swift 6.0 以降が必要です
|
||||
|
||||
## 新規プロジェクト
|
||||
## 新規プロジェクト {#new-project}
|
||||
|
||||
最初のステップは、コンピュータに新しい Vapor プロジェクトを作成することです。ターミナルを開き、ツールボックスの新規プロジェクトコマンドを使用してください。これにより、現在のディレクトリにプロジェクトを含む新しいフォルダが作成されます。
|
||||
|
||||
|
|
@ -36,7 +36,7 @@ vapor new hello -n
|
|||
cd hello
|
||||
```
|
||||
|
||||
## ビルド & 実行
|
||||
## ビルド & 実行 {#build-run}
|
||||
|
||||
### Xcode
|
||||
|
||||
|
|
@ -75,7 +75,7 @@ swift run
|
|||
[ INFO ] Server starting on http://127.0.0.1:8080
|
||||
```
|
||||
|
||||
## Localhost へのアクセス
|
||||
## Localhost へのアクセス {#visit-localhost}
|
||||
|
||||
ウェブブラウザを開き、<a href="http://localhost:8080/hello" target="_blank">localhost:8080/hello</a> または <a href="http://127.0.0.1:8080" target="_blank">http://127.0.0.1:8080</a> にアクセスしてください。
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
SPM は Cocoapods 、Ruby gems 、 NPM に似ています。SPM は、`swift build` や `swift test` などのコマンドでコマンドラインから使用することも、互換性のある IDE から使用することもできます。しかし、他のパッケージマネージャとは異なり、SPM パッケージのための中央のパッケージインデックスは存在しません。SPM は代わりに、Git リポジトリへの URL を利用し、[Git タグ](https://git-scm.com/book/en/v2/Git-Basics-Tagging)を使用して依存関係のバージョンを管理します。
|
||||
|
||||
## パッケージマニフェスト
|
||||
## パッケージマニフェスト {#package-manifest}
|
||||
|
||||
SPM がプロジェクトで最初に探す場所は、パッケージマニフェストです。これは常にプロジェクトのルートディレクトリに配置され、`Package.swift` という名前でなければなりません。
|
||||
|
||||
|
|
@ -63,7 +63,7 @@ let package = Package(
|
|||
|
||||
ターゲットは、パッケージが含むすべてのモジュール、実行ファイル、テストです。ほとんどの Vapor アプリは 2 つのターゲットを持っていますが、コードを整理するために必要なだけ多くのターゲットを追加することができます。各ターゲットは、それが依存するモジュールを宣言します。コード内でそれらをインポートするためには、ここでモジュールの名前を追加する必要があります。ターゲットは、プロジェクト内の他のターゲットや、[主な依存関係](#dependencies)配列に追加したパッケージで公開されている任意のモジュールに依存することができます。
|
||||
|
||||
## フォルダ構造
|
||||
## フォルダ構造 {#folder-structure}
|
||||
|
||||
以下は、SPM パッケージの典型的なフォルダ構造です。
|
||||
|
||||
|
|
@ -80,7 +80,7 @@ let package = Package(
|
|||
各 `.target` や `.executableTarget` は、`Sources` 内のフォルダに対応しています。
|
||||
各`.testTarget` は、`Tests` 内のフォルダに対応しています。
|
||||
|
||||
## Package.resolved
|
||||
## Package.resolved {#packageresolved}
|
||||
|
||||
プロジェクトを初めてビルドすると、SPM は各依存関係のバージョンを保存する `Package.resolved` ファイルを作成します。次にプロジェクトをビルドするとき、新しいバージョンが利用可能であっても、これらの同じバージョンが使用されます。
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
このページでは、Xcode の使用に関するいくつかのヒントとテクニックを紹介します。異なる開発環境を使用している場合、このセクションはスキップしてもよいです。
|
||||
|
||||
## カスタムワーキングディレクトリ
|
||||
## カスタムワーキングディレクトリ {#custom-working-directory}
|
||||
|
||||
デフォルトでは、Xcode はあなたのプロジェクトを _DerivedData_ フォルダから実行します。このフォルダは、プロジェクトのルートフォルダ ( _Package.swift_ ファイルがある場所) とは異なります。これは、 Vapor が _.env_ や _Public_ のようなファイルやフォルダを見つけることができないことを意味します。
|
||||
|
||||
|
|
|
|||
|
|
@ -1,13 +1,13 @@
|
|||
Vapor ドキュメントへようこそ! Vapor は Swift の Web フレームワークで、Swift でバックエンド、ウェブアプリの API、HTTP サーバーを書くことができます。 Vapor は Swift で書いており、それは伝統的なサーバー言語よりも多くの利点を提供するモダンで強力で安全な言語です。
|
||||
|
||||
## はじめに
|
||||
## はじめに {#getting-started}
|
||||
|
||||
もし、Vapor を使うのが初めてならば、Swift と Vapor をインストールするために[インストール → macOS](install/macos.md)に進んでください。
|
||||
|
||||
Vapor をインストールしたら、初めての Vapor アプリを作成するために[はじめに → Hello, world](getting-started/hello-world.md)をチェックしてください!
|
||||
|
||||
|
||||
## その他の情報源
|
||||
## その他の情報源 {#other-sources}
|
||||
|
||||
Vapor に関する情報を見つけるには、他にも素晴らしい場所があります。
|
||||
|
||||
|
|
@ -20,10 +20,10 @@ Vapor に関する情報を見つけるには、他にも素晴らしい場所
|
|||
| ソースコード | Vapor の内部での動作を学びます | [visit →](https://github.com/vapor/vapor) |
|
||||
| GitHub Issues | GitHub でバグを報告したり、機能をリクエストします | [visit →](https://github.com/vapor/vapor/issues) |
|
||||
|
||||
## 旧ドキュメント
|
||||
## 旧ドキュメント {#old-documentation}
|
||||
|
||||
廃止されたバージョンの Vapor ドキュメントは、[https://legacy.docs.vapor.codes/](https://legacy.docs.vapor.codes/)で見ることができます。
|
||||
|
||||
## 著者
|
||||
## 著者 {#authors}
|
||||
|
||||
Vapor コアチーム、および Vapor コミュニティの数百人のメンバー。
|
||||
|
|
|
|||
|
|
@ -1,20 +1,20 @@
|
|||
# Linux にインストール
|
||||
# Linux にインストール {#install-on-linux}
|
||||
|
||||
Vapor を使うには、Swift 5.9 以上が必要です。これは Swift Server Workgroup が提供する CLI ツール [Swiftly](https://swiftlang.github.io/swiftly/) を使ってインストールできます(推奨)。または、[Swift.org](https://swift.org/download/) で利用可能なツールチェーンを使用してインストールできます。
|
||||
|
||||
## サポートされているディストリビューションとバージョン
|
||||
## サポートされているディストリビューションとバージョン {#supported-distributions-and-versions}
|
||||
Vapor は、Swift 5.9 またはそれ以上の新しいバージョンがサポートする Linux ディストリビューションと同じバージョンをサポートしています。公式にサポートされているオペレーティングシステムの最新情報については、[公式サポートページ](https://www.swift.org/platform-support/)を参照してください。
|
||||
|
||||
|
||||
公式にはサポートされていない Linux ディストリビューションでも、ソースコードをコンパイルすることで、Swift を実行できるかもしれませんが、Vapor は安定性を保証できません。[Swift repo](https://github.com/apple/swift#getting-started) から Swift のコンパイル方法について詳しく学ぶことができます。
|
||||
|
||||
## Swift のインストール
|
||||
## Swift のインストール {#install-swift}
|
||||
|
||||
### Swiftly CLI ツールを使用した自動インストール (推奨)
|
||||
### Swiftly CLI ツールを使用した自動インストール (推奨) {#automated-installation-using-swiftly-cli-tool-recommended}
|
||||
|
||||
Linux で Swiftly と Swift をインストールする手順については、[Swiftly のウェブサイト](https://swiftlang.github.io/swiftly/)をご覧ください。その手順に従った後、次のコマンドで Swift をインストールします。
|
||||
|
||||
#### 基本的な使い方
|
||||
#### 基本的な使い方 {#basic-usage}
|
||||
|
||||
```sh
|
||||
$ swiftly install latest
|
||||
|
|
@ -31,7 +31,7 @@ Swift version 5.9.1 (swift-5.9.1-RELEASE)
|
|||
Target: x86_64-unknown-linux-gnu
|
||||
```
|
||||
|
||||
### ツールチェーンを使用した手動インストール
|
||||
### ツールチェーンを使用した手動インストール {#manual-installation-with-the-toolchain}
|
||||
|
||||
Linux 上で Swift をインストールする方法については、Swift.org の[ダウンロードの使用](https://swift.org/download/#using-downloads)を参照してください。
|
||||
|
||||
|
|
@ -49,7 +49,7 @@ Fedora 35 を使用している場合、Swift 5.9 またはそれ以降のバー
|
|||
|
||||
Swift の公式Docker イメージも使用できます。これにはコンパイラが事前にインストールされています。[Swift の Docker Hub](https://hub.docker.com/_/swift) で詳しく学ぶことができます。
|
||||
|
||||
## ツールボックスのインストール
|
||||
## ツールボックスのインストール {#install-toolbox}
|
||||
|
||||
Swift をインストールしたら、[Vapor Toolbox](https://github.com/vapor/toolbox) をインストールしましょう。この CLI ツールは、Vapor を使用するために必須ではありませんが、新しい Vapor プロジェクトの作成に役立ちます。
|
||||
|
||||
|
|
@ -88,6 +88,6 @@ vapor --help
|
|||
|
||||
利用可能なコマンドのリストが表示されるはずです。
|
||||
|
||||
## 次へ
|
||||
## 次へ {#next}
|
||||
|
||||
Swift と Vapor Toolbox をインストールしたら、[はじめに → Hello, world](../getting-started/hello-world.md) で初めてのアプリを作成してください。
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
# macOS へのインストール
|
||||
# macOS へのインストール {#install-on-macos}
|
||||
|
||||
Vapor を macOS で使用するには、Swift 5.9 以上が必要です。Swift とそれに関連するすべての依存関係は、Xcode にバンドルされています。
|
||||
|
||||
## Xcode のインストール
|
||||
## Xcode のインストール {#install-xcode}
|
||||
|
||||
Mac App Store から[Xcode](https://itunes.apple.com/us/app/xcode/id497799835?mt=12) をインストールします。
|
||||
|
||||
|
|
@ -26,7 +26,7 @@ Target: arm64-apple-macosx13.0
|
|||
|
||||
Vapor 4 は、Swift 5.9 以上が必要です。
|
||||
|
||||
## Toolbox のインストール
|
||||
## Toolbox のインストール {#install-toolbox}
|
||||
|
||||
Swift をインストールしたので、次に [Vapor Toolbox](https://github.com/vapor/toolbox) をインストールしましょう。この CLI ツールは Vapor を使用するためには必須ではありませんが、新しい Vapor プロジェクトの作成を支援します。
|
||||
|
||||
|
|
@ -65,6 +65,6 @@ vapor --help
|
|||
|
||||
利用可能なコマンドのリストが表示されるはずです。
|
||||
|
||||
## 次へ
|
||||
## 次へ {#next}
|
||||
|
||||
Swift と Vapor Toolbox をインストールしたので、 [はじめに → Hello, world](../getting-started/hello-world.md) で初めてのアプリを作成してください。
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# カスタムタグ
|
||||
# カスタムタグ {#custom-tags}
|
||||
|
||||
[`LeafTag`](https://api.vapor.codes/leafkit/documentation/leafkit/leaftag) プロトコルを使用して、カスタム Leaf タグを作成することができます。
|
||||
|
||||
|
|
@ -48,7 +48,7 @@ struct NowTag: LeafTag {
|
|||
}
|
||||
```
|
||||
|
||||
## タグの設定
|
||||
## タグの設定 {#configure-tag}
|
||||
|
||||
`NowTag` を実装したので、Leaf にそれを伝えるだけです。このようにして、たとえ別のパッケージで定義されたタグでも追加することができます。通常、これを `configure.swift` で行います:
|
||||
|
||||
|
|
@ -62,18 +62,18 @@ app.leaf.tags["now"] = NowTag()
|
|||
The time is #now()
|
||||
```
|
||||
|
||||
## コンテキストプロパティ
|
||||
## コンテキストプロパティ {#context-properties}
|
||||
|
||||
`LeafContext` には、重要なプロパティが 2 つあります。それが `parameters` と `data` です。この 2 つで必要な情報はすべて揃っています。
|
||||
|
||||
- `parameters`: タグのパラメータを含む配列です
|
||||
- `data`: コンテキストとして `render(_:_:)` に渡されたビューのデータを含む辞書です
|
||||
|
||||
### Hello タグによる実例
|
||||
### Hello タグによる実例 {#example-hello-tag}
|
||||
|
||||
これを理解するために、両方のプロパティを使ったシンプルな hello タグを実装してみましょう。
|
||||
|
||||
#### parameters の使用
|
||||
#### parameters の使用 {#using-parameters}
|
||||
|
||||
nameの値が提供される、1つ目のパラメータにアクセスできます
|
||||
|
||||
|
|
@ -97,7 +97,7 @@ struct HelloTag: UnsafeUnescapedLeafTag {
|
|||
#hello("John")
|
||||
```
|
||||
|
||||
#### data の使用
|
||||
#### data の使用 {#using-data}
|
||||
|
||||
data プロパティの中の "name" キーを使って名前の値にアクセスします。
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ let package = Package(
|
|||
)
|
||||
```
|
||||
|
||||
## 設定
|
||||
## 設定 {#configure}
|
||||
|
||||
パッケージをプロジェクトに追加したら、Vapor を設定してそれを使用するように構成します。これは通常、[`configure.swift`](../getting-started/folder-structure.md#configureswift) で行います。
|
||||
|
||||
|
|
@ -44,7 +44,7 @@ app.views.use(.leaf)
|
|||
!!! warning
|
||||
Xcode から実行する際に Leaf がテンプレートを見つけられるようにするためには、 Xcode ワークスペースの [custom working directory](../getting-started/xcode.md#custom-working-directory) を設定する必要があります。
|
||||
|
||||
### ページレンダリング用のキャッシュ
|
||||
### ページレンダリング用のキャッシュ {#cache-for-rendering-pages}
|
||||
|
||||
Leaf には、ページをレンダリングするための内部キャッシュがあります。`Application` の環境が `.development` に設定されている場合、このキャッシュは無効になり、テンプレートへの変更が即座に反映されます。`.production` やその他の環境では、キャッシュがデフォルトで有効になっており、テンプレートに加えた変更はアプリケーションを再起動するまで反映されません。
|
||||
|
||||
|
|
@ -56,7 +56,7 @@ app.leaf.cache.isEnabled = false
|
|||
|
||||
!!! warning
|
||||
キャッシュを無効にすることはデバッグには役立ちますが、リクエストごとにテンプレートを再コンパイルする必要があるため、パフォーマンスに大きな影響を与える可能性があるため、本番環境では推奨されません。
|
||||
## フォルダ構成
|
||||
## フォルダ構成 {#folder-structure}
|
||||
|
||||
Leaf を設定したら、`.leaf` ファイルを格納するための `Views` フォルダを用意する必要があります。デフォルトでは、Leaf はプロジェクトのルートに対して `./Resources/Views` というフォルダを要求します。
|
||||
|
||||
|
|
@ -75,7 +75,7 @@ VaporApp
|
|||
└── ...
|
||||
```
|
||||
|
||||
## Viewのレンダリング
|
||||
## Viewのレンダリング {#rendering-a-view}
|
||||
|
||||
Leaf が設定できたので、最初のテンプレートをレンダリングしてみましょう。`Resources/Views` フォルダ内に、次の内容で `hello.leaf` という新しいファイルを作成します。
|
||||
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
# Leaf 概要
|
||||
# Leaf 概要 {#leaf-overview}
|
||||
|
||||
Leaf は、Swift にインスパイアされた構文を持つ強力なテンプレート言語です。これを使って、フロントエンドのウェブサイト向けに動的な HTML ページを生成したり、API から送信するリッチなメールを生成したりできます。
|
||||
|
||||
このガイドでは、Leaf の構文と使用可能なタグについての概要を説明します。
|
||||
|
||||
## テンプレート構文
|
||||
## テンプレート構文 {#template-syntax}
|
||||
|
||||
ここに、基本的な Leaf タグの使用例を示します。
|
||||
|
||||
|
|
@ -72,11 +72,11 @@ return req.view.render("home", WelcomeContext(title: "Hello!", numbers: [42, 900
|
|||
#endfor
|
||||
```
|
||||
|
||||
## 使用例
|
||||
## 使用例 {#usage}
|
||||
|
||||
以下は、Leaf の一般的な使用例です。
|
||||
|
||||
### 条件
|
||||
### 条件 {#conditions}
|
||||
|
||||
Leaf は、`#if` タグを使用してさまざまな条件を評価できます。例えば、変数を提供すると、その変数がコンテキストに存在するかチェックします:
|
||||
|
||||
|
|
@ -120,7 +120,7 @@ Leaf は、`#if` タグを使用してさまざまな条件を評価できます
|
|||
#endif
|
||||
```
|
||||
|
||||
### ループ
|
||||
### ループ {#loops}
|
||||
|
||||
アイテムの配列を提供すると、Leaf はそれをループし、 `#for` タグを使用して各アイテムを個別に操作できます。
|
||||
|
||||
|
|
@ -154,7 +154,7 @@ Planets:
|
|||
- Mars
|
||||
```
|
||||
|
||||
### テンプレートの拡張
|
||||
### テンプレートの拡張 {#extending-templates}
|
||||
|
||||
Leaf の `#extend` タグを使用すると、あるテンプレートの内容を別のテンプレートにコピーすることができます。このタグを使用する場合、テンプレートファイルの拡張子 .leaf を常に省略する必要があります。
|
||||
|
||||
|
|
@ -200,7 +200,7 @@ Leaf の `#extend` タグを使用すると、あるテンプレートの内容
|
|||
</html>
|
||||
```
|
||||
|
||||
### その他のタグ
|
||||
### その他のタグ {#other-tags}
|
||||
|
||||
#### `#count`
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ struct CustomRedisSessionsDelegate: RedisSessionsDelegate {
|
|||
app.sessions.use(.redis(delegate: CustomRedisSessionsDelegate()))
|
||||
```
|
||||
|
||||
## RedisSessionsDelegate {#redissessionsdelegate}
|
||||
## RedisSessionsDelegate
|
||||
|
||||
> APIドキュメント:[`RedisSessionsDelegate`](https://api.vapor.codes/redis/documentation/redis/redissessionsdelegate)
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ VaporのAuthentication APIは、[Basic](https://tools.ietf.org/html/rfc7617)お
|
|||
|
||||
認証が成功した場合、オーセンティケータは検証されたユーザーを`req.auth`に追加します。このユーザーは、オーセンティケータによって保護されているルートで`req.auth.get(_:)`を使用してアクセスできます。認証が失敗した場合、ユーザーは`req.auth`に追加されず、アクセスしようとしても失敗します。
|
||||
|
||||
## Authenticatable {#authenticatable}
|
||||
## Authenticatable
|
||||
|
||||
Authentication APIを使用するには、まず`Authenticatable`に準拠するユーザータイプが必要です。これは`struct`、`class`、またはFluentの`Model`でも構いません。以下の例では、`name`という1つのプロパティを持つシンプルな`User`構造体を想定しています。
|
||||
|
||||
|
|
@ -55,7 +55,7 @@ let protected = app.grouped(UserAuthenticator())
|
|||
|
||||
認証の要求は、オーセンティケータの構成を可能にするため、オーセンティケータミドルウェアによって行われません。[構成](#composition)の詳細については以下をお読みください。
|
||||
|
||||
## Basic {#basic}
|
||||
## Basic
|
||||
|
||||
Basic認証は、`Authorization`ヘッダーでユーザー名とパスワードを送信します。ユーザー名とパスワードはコロン(例:`test:secret`)で連結され、base-64エンコードされ、`"Basic "`でプレフィックスされます。次の例のリクエストは、ユーザー名`test`とパスワード`secret`をエンコードしています。
|
||||
|
||||
|
|
@ -116,7 +116,7 @@ struct UserAuthenticator: AsyncBasicAuthenticator {
|
|||
|
||||
このオーセンティケータをアプリに追加し、上記で定義したルートをテストすると、ログインが成功した場合に名前`"Vapor"`が返されるはずです。認証情報が正しくない場合は、`401 Unauthorized`エラーが表示されるはずです。
|
||||
|
||||
## Bearer {#bearer}
|
||||
## Bearer
|
||||
|
||||
Bearer認証は、`Authorization`ヘッダーでトークンを送信します。トークンには`"Bearer "`がプレフィックスされます。次の例のリクエストはトークン`foo`を送信しています。
|
||||
|
||||
|
|
@ -252,7 +252,7 @@ print(user?.name) // String?
|
|||
req.auth.logout(User.self)
|
||||
```
|
||||
|
||||
## Fluent {#fluent}
|
||||
## Fluent
|
||||
|
||||
[Fluent](../fluent/overview.md)は、既存のモデルに追加できる`ModelAuthenticatable`と`ModelTokenAuthenticatable`の2つのプロトコルを定義しています。モデルをこれらのプロトコルに準拠させることで、エンドポイントを保護するためのオーセンティケータを作成できます。
|
||||
|
||||
|
|
@ -395,7 +395,7 @@ Content-Type: application/json
|
|||
}
|
||||
```
|
||||
|
||||
#### Model Authenticatable {#model-authenticatable}
|
||||
#### Model Authenticatable
|
||||
|
||||
これで、ユーザーモデルと新しいユーザーを作成するためのエンドポイントができたので、モデルを`ModelAuthenticatable`に準拠させましょう。これにより、モデルをユーザー名とパスワードを使用して認証できるようになります。
|
||||
|
||||
|
|
@ -539,7 +539,7 @@ passwordProtected.post("login") { req async throws -> UserToken in
|
|||
|
||||
後で使用するので、取得したトークンを保持してください。
|
||||
|
||||
#### Model Token Authenticatable {#model-token-authenticatable}
|
||||
#### Model Token Authenticatable
|
||||
|
||||
`UserToken`を`ModelTokenAuthenticatable`に準拠させます。これにより、トークンが`User`モデルを認証できるようになります。
|
||||
|
||||
|
|
@ -589,7 +589,7 @@ Vaporの[Session API](../advanced/sessions.md)を使用して、リクエスト
|
|||
|
||||
セッションは、Webブラウザに直接HTMLを提供するVaporで構築されたフロントエンドWebアプリケーションに最適です。APIの場合、リクエスト間でユーザーデータを永続化するために、ステートレスなトークンベースの認証を使用することをお勧めします。
|
||||
|
||||
### Session Authenticatable {#session-authenticatable}
|
||||
### Session Authenticatable
|
||||
|
||||
セッションベースの認証を使用するには、`SessionAuthenticatable`に準拠するタイプが必要です。この例では、シンプルな構造体を使用します。
|
||||
|
||||
|
|
@ -698,7 +698,7 @@ cookie: vapor_session=123
|
|||
|
||||
今回は、`UserSessionAuthenticator`がユーザーを認証し、再びユーザーのメールが返されるはずです。
|
||||
|
||||
### Model Session Authenticatable {#model-session-authenticatable}
|
||||
### Model Session Authenticatable
|
||||
|
||||
Fluentモデルは、`ModelSessionAuthenticatable`に準拠することで`SessionAuthenticator`を生成できます。これは、モデルの一意の識別子をセッション識別子として使用し、セッションからモデルを復元するためのデータベース検索を自動的に実行します。
|
||||
|
||||
|
|
@ -811,7 +811,7 @@ credentialsProtectedRoute.post("login", use: loginPostHandler)
|
|||
|
||||
`CredentialsAuthenticator`は、リクエストボディから`username`と`password`を抽出し、ユーザー名からユーザーを見つけ、パスワードを検証します。パスワードが有効な場合、ミドルウェアはリクエストを認証します。その後、`SessionAuthenticator`が後続のリクエストのためにセッションを認証します。
|
||||
|
||||
## JWT {#jwt}
|
||||
## JWT
|
||||
|
||||
[JWT](jwt.md)は、着信リクエストでJSON Web Tokenを認証するために使用できる`JWTAuthenticator`を提供します。JWTを初めて使用する場合は、[概要](jwt.md)を確認してください。
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
Vapor には [SwiftCrypto](https://github.com/apple/swift-crypto/) が含まれており、これは Apple の CryptoKit ライブラリの Linux 互換ポートです。SwiftCrypto がまだサポートしていない [Bcrypt](https://ja.wikipedia.org/wiki/Bcrypt) や [TOTP](https://ja.wikipedia.org/wiki/Time-based_One-time_Password) のような追加の暗号 API も公開されています。
|
||||
|
||||
## SwiftCrypto {#swiftcrypto}
|
||||
## SwiftCrypto
|
||||
|
||||
Swift の `Crypto` ライブラリは Apple の CryptoKit API を実装しています。そのため、[CryptoKit ドキュメント](https://developer.apple.com/documentation/cryptokit) と [WWDC トーク](https://developer.apple.com/videos/play/wwdc2019/709) は API を学ぶための優れたリソースです。
|
||||
|
||||
|
|
@ -23,7 +23,7 @@ CryptoKit には以下のサポートが含まれています:
|
|||
- 公開鍵暗号:`Curve25519`、`P521`、`P384`、`P256`
|
||||
- 安全でないハッシュ化:`SHA1`、`MD5`
|
||||
|
||||
## Bcrypt {#bcrypt}
|
||||
## Bcrypt
|
||||
|
||||
Bcrypt はランダム化されたソルトを使用して、同じパスワードを複数回ハッシュ化しても同じダイジェストにならないようにするパスワードハッシュアルゴリズムです。
|
||||
|
||||
|
|
@ -50,11 +50,11 @@ if pass {
|
|||
|
||||
Bcrypt パスワードでのログインは、まずメールアドレスまたはユーザー名でデータベースからユーザーのパスワードダイジェストを取得することで実装できます。その後、既知のダイジェストを提供された平文パスワードに対して検証できます。
|
||||
|
||||
## OTP {#otp}
|
||||
## OTP
|
||||
|
||||
Vapor は HOTP と TOTP の両方のワンタイムパスワードをサポートしています。OTP は SHA-1、SHA-256、SHA-512 ハッシュ関数で動作し、6 桁、7 桁、または 8 桁の出力を提供できます。OTP は、単一使用の人間が読めるパスワードを生成することで認証を提供します。これを行うために、両当事者はまず対称鍵に合意し、生成されたパスワードのセキュリティを維持するために常に秘密にしておく必要があります。
|
||||
|
||||
#### HOTP {#hotp}
|
||||
#### HOTP
|
||||
|
||||
HOTP は HMAC 署名に基づく OTP です。対称鍵に加えて、両当事者はパスワードの一意性を提供する数値であるカウンターにも合意します。各生成試行後、カウンターは増加します。
|
||||
|
||||
|
|
@ -67,7 +67,7 @@ let code = hotp.generate(counter: 25)
|
|||
HOTP.generate(key: key, digest: .sha256, digits: .six, counter: 25)
|
||||
```
|
||||
|
||||
#### TOTP {#totp}
|
||||
#### TOTP
|
||||
|
||||
TOTP は HOTP の時間ベースのバリエーションです。ほとんど同じように動作しますが、単純なカウンターの代わりに、現在の時刻を使用して一意性を生成します。非同期クロック、ネットワーク遅延、ユーザーの遅延、およびその他の混乱要因によって導入される避けられないずれを補償するために、生成された TOTP コードは指定された時間間隔(最も一般的には 30 秒)にわたって有効のままです。
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# パスワード
|
||||
# パスワード {#passwords}
|
||||
|
||||
Vaporには、パスワードを安全に保存・検証するためのパスワードハッシュAPIが含まれています。このAPIは環境に基づいて設定可能で、非同期ハッシュ化をサポートしています。
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# 4.0へのアップグレード {#upgrading-to-4.0}
|
||||
# 4.0へのアップグレード {#upgrading-to-40}
|
||||
|
||||
このガイドでは、既存のVapor 3.xプロジェクトを4.xにアップグレードする方法を説明します。このガイドでは、Vaporの公式パッケージに加え、よく使用されるプロバイダーについても網羅します。不足している内容があれば、[Vaporのチームチャット](https://discord.gg/vapor)で質問するのがおすすめです。IssuesやPull Requestも歓迎です。
|
||||
|
||||
|
|
@ -8,7 +8,7 @@ Vapor 4を使用するには、Xcode 11.4およびmacOS 10.15以上が必要で
|
|||
|
||||
ドキュメントのインストールセクションで依存関係のインストールについて説明しています。
|
||||
|
||||
## Package.swift
|
||||
## Package.swift {#packageswift}
|
||||
|
||||
Vapor 4へのアップグレードの最初のステップは、パッケージの依存関係を更新することです。以下は更新されたPackage.swiftファイルの例です。更新された[テンプレートPackage.swift](https://github.com/vapor/template/blob/main/Package.swift)も確認できます。
|
||||
|
||||
|
|
@ -130,7 +130,7 @@ try app.run()
|
|||
|
||||
基本的なAppモジュール構造の更新方法を見てみましょう。
|
||||
|
||||
### configure.swift
|
||||
### configure.swift {#configureswift}
|
||||
|
||||
`configure`メソッドは`Application`のインスタンスを受け入れるように変更する必要があります。
|
||||
|
||||
|
|
@ -162,11 +162,11 @@ public func configure(_ app: Application) throws {
|
|||
|
||||
ルーティング、ミドルウェア、Fluentなどの設定に関する構文の変更は以下で説明します。
|
||||
|
||||
### boot.swift
|
||||
### boot.swift {#bootswift}
|
||||
|
||||
`boot`の内容は、アプリケーションインスタンスを受け入れるようになったため、`configure`メソッドに配置できます。
|
||||
|
||||
### routes.swift
|
||||
### routes.swift {#routesswift}
|
||||
|
||||
`routes`メソッドは`Application`のインスタンスを受け入れるように変更する必要があります。
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue