mirror of https://github.com/vapor/docs.git
1694 lines
45 KiB
HTML
1694 lines
45 KiB
HTML
|
|
|
|
|
|
|
|
<!DOCTYPE html>
|
|
<html lang="en" class="no-js">
|
|
<head>
|
|
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
|
<meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
|
|
|
|
|
|
|
|
<meta name="lang:clipboard.copy" content="Copy to clipboard">
|
|
|
|
<meta name="lang:clipboard.copied" content="Copied to clipboard">
|
|
|
|
<meta name="lang:search.language" content="en">
|
|
|
|
<meta name="lang:search.pipeline.stopwords" content="True">
|
|
|
|
<meta name="lang:search.pipeline.trimmer" content="True">
|
|
|
|
<meta name="lang:search.result.none" content="No matching documents">
|
|
|
|
<meta name="lang:search.result.one" content="1 matching document">
|
|
|
|
<meta name="lang:search.result.other" content="# matching documents">
|
|
|
|
<meta name="lang:search.tokenizer" content="[\s\-]+">
|
|
|
|
<link rel="shortcut icon" href="../../assets/images/favicon.png">
|
|
<meta name="generator" content="mkdocs-0.17.3, mkdocs-material-2.7.0">
|
|
|
|
|
|
|
|
<title>Services - Vapor Docs</title>
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="../../assets/stylesheets/application.78aab2dc.css">
|
|
|
|
<link rel="stylesheet" href="../../assets/stylesheets/application-palette.6079476c.css">
|
|
|
|
|
|
|
|
<script src="../../assets/javascripts/modernizr.1aa3b519.js"></script>
|
|
|
|
|
|
<link href="https://fonts.gstatic.com" rel="preconnect" crossorigin>
|
|
|
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700|Roboto+Mono">
|
|
<style>body,input{font-family:"Roboto","Helvetica Neue",Helvetica,Arial,sans-serif}code,kbd,pre{font-family:"Roboto Mono","Courier New",Courier,monospace}</style>
|
|
|
|
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
|
|
|
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
<body dir="ltr" data-md-color-primary="blue" data-md-color-accent="purple">
|
|
|
|
<svg class="md-svg">
|
|
<defs>
|
|
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="416" height="448"
|
|
viewBox="0 0 416 448" id="github">
|
|
<path fill="currentColor" d="M160 304q0 10-3.125 20.5t-10.75 19-18.125
|
|
8.5-18.125-8.5-10.75-19-3.125-20.5 3.125-20.5 10.75-19 18.125-8.5
|
|
18.125 8.5 10.75 19 3.125 20.5zM320 304q0 10-3.125 20.5t-10.75
|
|
19-18.125 8.5-18.125-8.5-10.75-19-3.125-20.5 3.125-20.5 10.75-19
|
|
18.125-8.5 18.125 8.5 10.75 19 3.125 20.5zM360
|
|
304q0-30-17.25-51t-46.75-21q-10.25 0-48.75 5.25-17.75 2.75-39.25
|
|
2.75t-39.25-2.75q-38-5.25-48.75-5.25-29.5 0-46.75 21t-17.25 51q0 22 8
|
|
38.375t20.25 25.75 30.5 15 35 7.375 37.25 1.75h42q20.5 0
|
|
37.25-1.75t35-7.375 30.5-15 20.25-25.75 8-38.375zM416 260q0 51.75-15.25
|
|
82.75-9.5 19.25-26.375 33.25t-35.25 21.5-42.5 11.875-42.875 5.5-41.75
|
|
1.125q-19.5 0-35.5-0.75t-36.875-3.125-38.125-7.5-34.25-12.875-30.25-20.25-21.5-28.75q-15.5-30.75-15.5-82.75
|
|
0-59.25 34-99-6.75-20.5-6.75-42.5 0-29 12.75-54.5 27 0 47.5 9.875t47.25
|
|
30.875q36.75-8.75 77.25-8.75 37 0 70 8 26.25-20.5
|
|
46.75-30.25t47.25-9.75q12.75 25.5 12.75 54.5 0 21.75-6.75 42 34 40 34
|
|
99.5z" />
|
|
</svg>
|
|
|
|
</defs>
|
|
</svg>
|
|
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="drawer">
|
|
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="search">
|
|
<label class="md-overlay" data-md-component="overlay" for="drawer"></label>
|
|
|
|
<a href="#services" tabindex="1" class="md-skip">
|
|
Skip to content
|
|
</a>
|
|
|
|
|
|
<header class="md-header" data-md-component="header">
|
|
<nav class="md-header-nav md-grid">
|
|
<div class="md-flex">
|
|
<div class="md-flex__cell md-flex__cell--shrink">
|
|
<a href="../.." title="Vapor Docs" class="md-header-nav__button md-logo">
|
|
|
|
<img src="../../images/droplet-white.svg" width="24" height="24">
|
|
|
|
</a>
|
|
</div>
|
|
<div class="md-flex__cell md-flex__cell--shrink">
|
|
<label class="md-icon md-icon--menu md-header-nav__button" for="drawer"></label>
|
|
</div>
|
|
<div class="md-flex__cell md-flex__cell--stretch">
|
|
<div class="md-flex__ellipsis md-header-nav__title" data-md-component="title">
|
|
|
|
|
|
<span class="md-header-nav__topic">
|
|
Vapor Docs
|
|
</span>
|
|
<span class="md-header-nav__topic">
|
|
Services
|
|
</span>
|
|
|
|
|
|
</div>
|
|
</div>
|
|
<div class="md-flex__cell md-flex__cell--shrink">
|
|
|
|
|
|
<label class="md-icon md-icon--search md-header-nav__button" for="search"></label>
|
|
|
|
<div class="md-search" data-md-component="search" role="dialog">
|
|
<label class="md-search__overlay" for="search"></label>
|
|
<div class="md-search__inner" role="search">
|
|
<form class="md-search__form" name="search">
|
|
<input type="text" class="md-search__input" name="query" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="query" data-md-state="active">
|
|
<label class="md-icon md-search__icon" for="search"></label>
|
|
<button type="reset" class="md-icon md-search__icon" data-md-component="reset" tabindex="-1">
|
|

|
|
</button>
|
|
</form>
|
|
<div class="md-search__output">
|
|
<div class="md-search__scrollwrap" data-md-scrollfix>
|
|
<div class="md-search-result" data-md-component="result">
|
|
<div class="md-search-result__meta">
|
|
Type to start searching
|
|
</div>
|
|
<ol class="md-search-result__list"></ol>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
<div class="md-flex__cell md-flex__cell--shrink">
|
|
<div class="md-header-nav__source">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a href="http://github.com/vapor/vapor/" title="Go to repository" class="md-source" data-md-source="github">
|
|
|
|
<div class="md-source__icon">
|
|
<svg viewBox="0 0 24 24" width="24" height="24">
|
|
<use xlink:href="#github" width="24" height="24"></use>
|
|
</svg>
|
|
</div>
|
|
|
|
<div class="md-source__repository">
|
|
GitHub
|
|
</div>
|
|
</a>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</nav>
|
|
</header>
|
|
|
|
<div class="md-container">
|
|
|
|
|
|
|
|
|
|
<main class="md-main">
|
|
<div class="md-main__inner md-grid" data-md-component="container">
|
|
|
|
|
|
<div class="md-sidebar md-sidebar--primary" data-md-component="navigation">
|
|
<div class="md-sidebar__scrollwrap">
|
|
<div class="md-sidebar__inner">
|
|
<nav class="md-nav md-nav--primary" data-md-level="0">
|
|
<label class="md-nav__title md-nav__title--site" for="drawer">
|
|
<span class="md-nav__button md-logo">
|
|
|
|
<img src="../../images/droplet-white.svg" width="48" height="48">
|
|
|
|
</span>
|
|
Vapor Docs
|
|
</label>
|
|
|
|
<div class="md-nav__source">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a href="http://github.com/vapor/vapor/" title="Go to repository" class="md-source" data-md-source="github">
|
|
|
|
<div class="md-source__icon">
|
|
<svg viewBox="0 0 24 24" width="24" height="24">
|
|
<use xlink:href="#github" width="24" height="24"></use>
|
|
</svg>
|
|
</div>
|
|
|
|
<div class="md-source__repository">
|
|
GitHub
|
|
</div>
|
|
</a>
|
|
|
|
</div>
|
|
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../.." title="Overview" class="md-nav__link">
|
|
Overview
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-2" type="checkbox" id="nav-2">
|
|
|
|
<label class="md-nav__link" for="nav-2">
|
|
Install
|
|
</label>
|
|
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-2">
|
|
Install
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../install/macos/" title="macOS" class="md-nav__link">
|
|
macOS
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../install/ubuntu/" title="Ubuntu" class="md-nav__link">
|
|
Ubuntu
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
|
|
|
|
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-3" type="checkbox" id="nav-3" checked>
|
|
|
|
<label class="md-nav__link" for="nav-3">
|
|
Getting started
|
|
</label>
|
|
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-3">
|
|
Getting started
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../hello-world/" title="Hello, world" class="md-nav__link">
|
|
Hello, world
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../toolbox/" title="Toolbox" class="md-nav__link">
|
|
Toolbox
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../spm/" title="SPM" class="md-nav__link">
|
|
SPM
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../xcode/" title="Xcode" class="md-nav__link">
|
|
Xcode
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../structure/" title="Folder Structure" class="md-nav__link">
|
|
Folder Structure
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../application/" title="Application" class="md-nav__link">
|
|
Application
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../controllers/" title="Controllers" class="md-nav__link">
|
|
Controllers
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../routing/" title="Routing" class="md-nav__link">
|
|
Routing
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../content/" title="Content" class="md-nav__link">
|
|
Content
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../futures/" title="Futures" class="md-nav__link">
|
|
Futures
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--active">
|
|
|
|
<input class="md-toggle md-nav__toggle" data-md-toggle="toc" type="checkbox" id="toc">
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__link md-nav__link--active" for="toc">
|
|
Services
|
|
</label>
|
|
|
|
<a href="./" title="Services" class="md-nav__link md-nav__link--active">
|
|
Services
|
|
</a>
|
|
|
|
|
|
<nav class="md-nav md-nav--secondary">
|
|
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__title" for="toc">Table of contents</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#container" title="Container" class="md-nav__link">
|
|
Container
|
|
</a>
|
|
|
|
<nav class="md-nav">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#make" title="Make" class="md-nav__link">
|
|
Make
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#services_1" title="Services" class="md-nav__link">
|
|
Services
|
|
</a>
|
|
|
|
<nav class="md-nav">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#instance" title="Instance" class="md-nav__link">
|
|
Instance
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#protocol" title="Protocol" class="md-nav__link">
|
|
Protocol
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#environment" title="Environment" class="md-nav__link">
|
|
Environment
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#config" title="Config" class="md-nav__link">
|
|
Config
|
|
</a>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../cloud/" title="Deployment" class="md-nav__link">
|
|
Deployment
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-4" type="checkbox" id="nav-4">
|
|
|
|
<label class="md-nav__link" for="nav-4">
|
|
Routing
|
|
</label>
|
|
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-4">
|
|
Routing
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../routing/getting-started/" title="Getting Started" class="md-nav__link">
|
|
Getting Started
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../routing/parameters/" title="Parameters" class="md-nav__link">
|
|
Parameters
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../routing/route/" title="Route" class="md-nav__link">
|
|
Route
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../routing/router/" title="Router" class="md-nav__link">
|
|
Router
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-5" type="checkbox" id="nav-5">
|
|
|
|
<label class="md-nav__link" for="nav-5">
|
|
Fluent
|
|
</label>
|
|
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-5">
|
|
Fluent
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../fluent/getting-started/" title="Getting Started" class="md-nav__link">
|
|
Getting Started
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../fluent/models/" title="Models" class="md-nav__link">
|
|
Models
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../fluent/migrations/" title="Migrations" class="md-nav__link">
|
|
Migrations
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../fluent/querying/" title="Querying" class="md-nav__link">
|
|
Querying
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../fluent/query-builder/" title="Query Builder" class="md-nav__link">
|
|
Query Builder
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../fluent/schema-builder/" title="Schema Builder" class="md-nav__link">
|
|
Schema Builder
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../fluent/relations/" title="Relations" class="md-nav__link">
|
|
Relations
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../fluent/pivot/" title="Pivot" class="md-nav__link">
|
|
Pivot
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../fluent/transaction/" title="Transaction" class="md-nav__link">
|
|
Transaction
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../fluent/database/" title="Database" class="md-nav__link">
|
|
Database
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-6" type="checkbox" id="nav-6">
|
|
|
|
<label class="md-nav__link" for="nav-6">
|
|
PostgreSQL
|
|
</label>
|
|
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-6">
|
|
PostgreSQL
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../postgresql/getting-started/" title="Getting Started" class="md-nav__link">
|
|
Getting Started
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../postgresql/fluent/" title="Fluent PostgreSQL" class="md-nav__link">
|
|
Fluent PostgreSQL
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../postgresql/core/" title="PostgreSQL Core" class="md-nav__link">
|
|
PostgreSQL Core
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-7" type="checkbox" id="nav-7">
|
|
|
|
<label class="md-nav__link" for="nav-7">
|
|
MySQL
|
|
</label>
|
|
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-7">
|
|
MySQL
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../mysql/getting-started/" title="Getting Started" class="md-nav__link">
|
|
Getting Started
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../mysql/fluent/" title="Fluent MySQL" class="md-nav__link">
|
|
Fluent MySQL
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../mysql/core/" title="MySQL Core" class="md-nav__link">
|
|
MySQL Core
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-8" type="checkbox" id="nav-8">
|
|
|
|
<label class="md-nav__link" for="nav-8">
|
|
SQLite
|
|
</label>
|
|
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-8">
|
|
SQLite
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../sqlite/getting-started/" title="Getting Started" class="md-nav__link">
|
|
Getting Started
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../sqlite/fluent/" title="Fluent SQLite" class="md-nav__link">
|
|
Fluent SQLite
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../sqlite/core/" title="SQLite Core" class="md-nav__link">
|
|
SQLite Core
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-9" type="checkbox" id="nav-9">
|
|
|
|
<label class="md-nav__link" for="nav-9">
|
|
Leaf
|
|
</label>
|
|
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-9">
|
|
Leaf
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../leaf/getting-started/" title="Getting Started" class="md-nav__link">
|
|
Getting Started
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../leaf/basics/" title="Basics" class="md-nav__link">
|
|
Basics
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../leaf/custom-tags/" title="Custom tags" class="md-nav__link">
|
|
Custom tags
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-10" type="checkbox" id="nav-10">
|
|
|
|
<label class="md-nav__link" for="nav-10">
|
|
Redis
|
|
</label>
|
|
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-10">
|
|
Redis
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../redis/getting-started/" title="Getting Started" class="md-nav__link">
|
|
Getting Started
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../redis/basics/" title="Basics" class="md-nav__link">
|
|
Basics
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../redis/custom-commands/" title="Custom commands" class="md-nav__link">
|
|
Custom commands
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../redis/pub-sub/" title="Publish and Subscribe" class="md-nav__link">
|
|
Publish and Subscribe
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../redis/pipeline/" title="Pipeline" class="md-nav__link">
|
|
Pipeline
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-11" type="checkbox" id="nav-11">
|
|
|
|
<label class="md-nav__link" for="nav-11">
|
|
WebSocket
|
|
</label>
|
|
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-11">
|
|
WebSocket
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../websocket/websocket/" title="Getting Started" class="md-nav__link">
|
|
Getting Started
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-12" type="checkbox" id="nav-12">
|
|
|
|
<label class="md-nav__link" for="nav-12">
|
|
Crypto
|
|
</label>
|
|
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-12">
|
|
Crypto
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../crypto/getting-started/" title="Getting Started" class="md-nav__link">
|
|
Getting Started
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../crypto/base64/" title="Base64" class="md-nav__link">
|
|
Base64
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../crypto/hash/" title="Hashes" class="md-nav__link">
|
|
Hashes
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../crypto/mac/" title="Message authentication" class="md-nav__link">
|
|
Message authentication
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../crypto/passwords/" title="Password hashing" class="md-nav__link">
|
|
Password hashing
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../crypto/random/" title="Random" class="md-nav__link">
|
|
Random
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-13" type="checkbox" id="nav-13">
|
|
|
|
<label class="md-nav__link" for="nav-13">
|
|
Testing
|
|
</label>
|
|
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-13">
|
|
Testing
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../testing/getting-started/" title="Getting Started" class="md-nav__link">
|
|
Getting Started
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-14" type="checkbox" id="nav-14">
|
|
|
|
<label class="md-nav__link" for="nav-14">
|
|
Deploy
|
|
</label>
|
|
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-14">
|
|
Deploy
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../deploy/getting-started/" title="Getting Started" class="md-nav__link">
|
|
Getting Started
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item md-nav__item--nested">
|
|
|
|
<input class="md-toggle md-nav__toggle" data-md-toggle="nav-15" type="checkbox" id="nav-15">
|
|
|
|
<label class="md-nav__link" for="nav-15">
|
|
Version (3.0-rc)
|
|
</label>
|
|
<nav class="md-nav" data-md-component="collapsible" data-md-level="1">
|
|
<label class="md-nav__title" for="nav-15">
|
|
Version (3.0-rc)
|
|
</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../version/1_5/" title="1.5" class="md-nav__link">
|
|
1.5
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../version/2_0/" title="2.0" class="md-nav__link">
|
|
2.0
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../version/3_0/" title="3.0-rc" class="md-nav__link">
|
|
3.0-rc
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="md-nav__item">
|
|
<a href="../../version/support/" title="Support" class="md-nav__link">
|
|
Support
|
|
</a>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</li>
|
|
|
|
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="md-sidebar md-sidebar--secondary" data-md-component="toc">
|
|
<div class="md-sidebar__scrollwrap">
|
|
<div class="md-sidebar__inner">
|
|
|
|
<nav class="md-nav md-nav--secondary">
|
|
|
|
|
|
|
|
|
|
|
|
<label class="md-nav__title" for="toc">Table of contents</label>
|
|
<ul class="md-nav__list" data-md-scrollfix>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#container" title="Container" class="md-nav__link">
|
|
Container
|
|
</a>
|
|
|
|
<nav class="md-nav">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#make" title="Make" class="md-nav__link">
|
|
Make
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#services_1" title="Services" class="md-nav__link">
|
|
Services
|
|
</a>
|
|
|
|
<nav class="md-nav">
|
|
<ul class="md-nav__list">
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#instance" title="Instance" class="md-nav__link">
|
|
Instance
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#protocol" title="Protocol" class="md-nav__link">
|
|
Protocol
|
|
</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
</nav>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#environment" title="Environment" class="md-nav__link">
|
|
Environment
|
|
</a>
|
|
|
|
</li>
|
|
|
|
<li class="md-nav__item">
|
|
<a href="#config" title="Config" class="md-nav__link">
|
|
Config
|
|
</a>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="md-content">
|
|
<article class="md-content__inner md-typeset">
|
|
|
|
|
|
<a href="https://github.com/vapor/documentation/edit/master/3.0/docs/getting-started/services.md" title="Edit this page" class="md-icon md-content__icon"></a>
|
|
|
|
|
|
<h1 id="services">Services<a class="headerlink" href="#services" title="Permanent link">¶</a></h1>
|
|
<p>Services is a dependency injection (also called inversion of control) framework for Vapor. The services framework allows you to register, configure, and initialize anything you might need in your application.</p>
|
|
<h2 id="container">Container<a class="headerlink" href="#container" title="Permanent link">¶</a></h2>
|
|
<p>Most of your interaction with services will happen through a container. A container is a combination of the following:</p>
|
|
<ul>
|
|
<li><a href="#services">Services</a>: A collection of registered services.</li>
|
|
<li><a href="#config">Config</a>: Declared preferences for certain services over others.</li>
|
|
<li><a href="#environment">Environment</a>: The application's current environment type (testing, production, etc)</li>
|
|
<li><a href="../futures/#event-loop">Worker</a>: The event loop associated with this container.</li>
|
|
</ul>
|
|
<p>The most common containers you will interact with in Vapor are:</p>
|
|
<ul>
|
|
<li><code>Application</code></li>
|
|
<li><code>Request</code></li>
|
|
<li><code>Response</code></li>
|
|
</ul>
|
|
<p>You should use the <code>Application</code> as a container to create services required for booting your app. You should use the <code>Request</code> or <code>Response</code> containers to create services for responding to requests (in route closures and controllers).</p>
|
|
<h3 id="make">Make<a class="headerlink" href="#make" title="Permanent link">¶</a></h3>
|
|
<p>Making services is simple, just call <code>.make(_:)</code> on a container and pass the type you want, usually a protocol like <code>Client</code>.</p>
|
|
<div class="codehilite"><pre><span></span><span class="kd">let</span> <span class="nv">client</span> <span class="p">=</span> <span class="k">try</span> <span class="n">req</span><span class="p">.</span><span class="n">make</span><span class="p">(</span><span class="n">Client</span><span class="p">.</span><span class="kc">self</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
|
|
<p>You can also specify a concrete type if you know exactly what you want.</p>
|
|
<div class="codehilite"><pre><span></span><span class="kd">let</span> <span class="nv">leaf</span> <span class="p">=</span> <span class="k">try</span> <span class="n">req</span><span class="p">.</span><span class="n">make</span><span class="p">(</span><span class="n">LeafRenderer</span><span class="p">.</span><span class="kc">self</span><span class="p">)</span>
|
|
<span class="bp">print</span><span class="p">(</span><span class="n">leaf</span><span class="p">)</span> <span class="c1">/// Definitely a LeafRenderer</span>
|
|
|
|
<span class="kd">let</span> <span class="nv">view</span> <span class="p">=</span> <span class="k">try</span> <span class="n">req</span><span class="p">.</span><span class="n">make</span><span class="p">(</span><span class="n">ViewRenderer</span><span class="p">.</span><span class="kc">self</span><span class="p">)</span>
|
|
<span class="bp">print</span><span class="p">(</span><span class="n">view</span><span class="p">)</span> <span class="c1">/// ViewRenderer, might be a LeafRenderer</span>
|
|
</pre></div>
|
|
|
|
|
|
<div class="admonition tip">
|
|
<p class="admonition-title">Tip</p>
|
|
<p>Try to rely on protocols over concrete types if you can. This will make testing your code easier (you can easily swap in dummy implementations) and it can help keep your code decoupled.</p>
|
|
</div>
|
|
<h2 id="services_1">Services<a class="headerlink" href="#services_1" title="Permanent link">¶</a></h2>
|
|
<p>The <code>Services</code> struct contains all of the services you—or the service providers you have added—have registered. You will usually register and configure your services in <a href="../structure/#configureswift"><code>configure.swift</code></a>.</p>
|
|
<h3 id="instance">Instance<a class="headerlink" href="#instance" title="Permanent link">¶</a></h3>
|
|
<p>You can register initialized service instances using <code>.register(_:)</code>.</p>
|
|
<div class="codehilite"><pre><span></span><span class="c1">/// Create an in-memory SQLite database</span>
|
|
<span class="kd">let</span> <span class="nv">sqlite</span> <span class="p">=</span> <span class="n">SQLiteDatabase</span><span class="p">(</span><span class="n">storage</span><span class="p">:</span> <span class="p">.</span><span class="n">memory</span><span class="p">)</span>
|
|
|
|
<span class="c1">/// Register to sevices.</span>
|
|
<span class="n">services</span><span class="p">.</span><span class="n">register</span><span class="p">(</span><span class="n">sqlite</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
|
|
<p>After you register a service, it will be available for creation by a <code>Container</code>. </p>
|
|
<div class="codehilite"><pre><span></span><span class="kd">let</span> <span class="nv">db</span> <span class="p">=</span> <span class="n">app</span><span class="p">.</span><span class="n">make</span><span class="p">(</span><span class="n">SQLiteDatabase</span><span class="p">.</span><span class="kc">self</span><span class="p">)</span>
|
|
<span class="bp">print</span><span class="p">(</span><span class="n">db</span><span class="p">)</span> <span class="c1">// SQLiteDatabase (the one we registered earlier)</span>
|
|
</pre></div>
|
|
|
|
|
|
<h3 id="protocol">Protocol<a class="headerlink" href="#protocol" title="Permanent link">¶</a></h3>
|
|
<p>When registering services, you can also declare conformance to a particular protocol. You might have noticed that this is how Vapor registers its main router.</p>
|
|
<div class="codehilite"><pre><span></span><span class="c1">/// Register routes to the router</span>
|
|
<span class="kd">let</span> <span class="nv">router</span> <span class="p">=</span> <span class="n">EngineRouter</span><span class="p">.</span><span class="k">default</span><span class="p">()</span>
|
|
<span class="k">try</span> <span class="n">routes</span><span class="p">(</span><span class="n">router</span><span class="p">)</span>
|
|
<span class="n">services</span><span class="p">.</span><span class="n">register</span><span class="p">(</span><span class="n">router</span><span class="p">,</span> <span class="k">as</span><span class="p">:</span> <span class="n">Router</span><span class="p">.</span><span class="kc">self</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
|
|
<p>Since we register the <code>router</code> variable with <code>as: Router.self</code>, it can be created using either the concrete type or the protocol.</p>
|
|
<div class="codehilite"><pre><span></span><span class="kd">let</span> <span class="nv">router</span> <span class="p">=</span> <span class="n">app</span><span class="p">.</span><span class="n">make</span><span class="p">(</span><span class="n">Router</span><span class="p">.</span><span class="kc">self</span><span class="p">)</span>
|
|
<span class="kd">let</span> <span class="nv">engineRouter</span> <span class="p">=</span> <span class="n">app</span><span class="p">.</span><span class="n">make</span><span class="p">(</span><span class="n">EngineRouter</span><span class="p">.</span><span class="kc">self</span><span class="p">)</span>
|
|
<span class="bp">print</span><span class="p">(</span><span class="n">router</span><span class="p">)</span> <span class="c1">// Router (actually EngineRouter)</span>
|
|
<span class="bp">print</span><span class="p">(</span><span class="n">engineRouter</span><span class="p">)</span> <span class="c1">// EngineRouter</span>
|
|
<span class="bp">print</span><span class="p">(</span><span class="n">router</span> <span class="p">===</span> <span class="n">engineRouter</span><span class="p">)</span> <span class="c1">// true</span>
|
|
</pre></div>
|
|
|
|
|
|
<h2 id="environment">Environment<a class="headerlink" href="#environment" title="Permanent link">¶</a></h2>
|
|
<p>The environment is used to dynamically change how your Vapor app behaves in certain situations. For example, you probably want to use a different username and password for your database when your application is deployed. The <code>Environment</code> type makes managing this easy.</p>
|
|
<p>When you run your Vapor app from the command line, you can pass an optional <code>--env</code> flag to specify the environment. By default, the environment will be <code>.development</code>.</p>
|
|
<div class="codehilite"><pre><span></span>swift run Run --env prod
|
|
</pre></div>
|
|
|
|
|
|
<p>In the above example, we are running Vapor in the <code>.production</code> environment. This environment specifies <code>isRelease = true</code>.</p>
|
|
<p>You can use the environment passed into <a href="../structure/#configureswift"><code>configure.swift</code></a> to dynamically register services.</p>
|
|
<div class="codehilite"><pre><span></span><span class="kd">let</span> <span class="nv">sqlite</span><span class="p">:</span> <span class="n">SQLiteDatabase</span>
|
|
<span class="k">if</span> <span class="n">env</span><span class="p">.</span><span class="n">isRelease</span> <span class="p">{</span>
|
|
<span class="c1">/// Create file-based SQLite db using $SQLITE_PATH from process env</span>
|
|
<span class="n">sqlite</span> <span class="p">=</span> <span class="k">try</span> <span class="n">SQLiteDatabase</span><span class="p">(</span><span class="n">storage</span><span class="p">:</span> <span class="p">.</span><span class="n">file</span><span class="p">(</span><span class="n">path</span><span class="p">:</span> <span class="n">Environment</span><span class="p">.</span><span class="kr">get</span><span class="p">(</span><span class="s">"SQLITE_PATH"</span><span class="p">)</span><span class="o">!</span><span class="p">))</span>
|
|
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
|
<span class="c1">/// Create an in-memory SQLite database</span>
|
|
<span class="n">sqlite</span> <span class="p">=</span> <span class="k">try</span> <span class="n">SQLiteDatabase</span><span class="p">(</span><span class="n">storage</span><span class="p">:</span> <span class="p">.</span><span class="n">memory</span><span class="p">)</span>
|
|
<span class="p">}</span>
|
|
<span class="n">services</span><span class="p">.</span><span class="n">register</span><span class="p">(</span><span class="n">sqlite</span><span class="p">)</span>
|
|
</pre></div>
|
|
|
|
|
|
<div class="admonition info">
|
|
<p class="admonition-title">Info</p>
|
|
<p>Use the static method <code>Environment.get(_:)</code> to fetch string values from the process environment.</p>
|
|
</div>
|
|
<p>You can also dynamically register services based on environment using the factory <code>.register(_:)</code> method.</p>
|
|
<div class="codehilite"><pre><span></span><span class="n">services</span><span class="p">.</span><span class="n">register</span> <span class="p">{</span> <span class="n">container</span> <span class="p">-></span> <span class="n">BCryptConfig</span> <span class="k">in</span>
|
|
<span class="kd">let</span> <span class="nv">cost</span><span class="p">:</span> <span class="nb">Int</span>
|
|
|
|
<span class="k">switch</span> <span class="n">container</span><span class="p">.</span><span class="n">environment</span> <span class="p">{</span>
|
|
<span class="k">case</span> <span class="p">.</span><span class="n">production</span><span class="p">:</span> <span class="n">cost</span> <span class="p">=</span> <span class="mi">12</span>
|
|
<span class="k">default</span><span class="p">:</span> <span class="n">cost</span> <span class="p">=</span> <span class="mi">4</span>
|
|
<span class="p">}</span>
|
|
|
|
<span class="k">return</span> <span class="n">BCryptConfig</span><span class="p">(</span><span class="n">cost</span><span class="p">:</span> <span class="n">cost</span><span class="p">)</span>
|
|
<span class="p">}</span>
|
|
</pre></div>
|
|
|
|
|
|
<h2 id="config">Config<a class="headerlink" href="#config" title="Permanent link">¶</a></h2>
|
|
<p>If multiple services are available for a given protocol, you will need to use the <code>Config</code> struct to declare which service you prefer.</p>
|
|
<div class="codehilite"><pre><span></span>ServiceError.ambiguity: Please choose which KeyedCache you prefer, multiple are available: MemoryKeyedCache, FluentCache<SQLiteDatabase>.
|
|
</pre></div>
|
|
|
|
|
|
<p>This is also done in <a href="../structure/#configureswift"><code>configure.swift</code></a>, just use the <code>config.prefer(_:for:)</code> method.</p>
|
|
<div class="codehilite"><pre><span></span><span class="c1">/// Declare preference for MemoryKeyedCache anytime a container is asked to create a KeyedCache</span>
|
|
<span class="n">config</span><span class="p">.</span><span class="n">prefer</span><span class="p">(</span><span class="n">MemoryKeyedCache</span><span class="p">.</span><span class="kc">self</span><span class="p">,</span> <span class="k">for</span><span class="p">:</span> <span class="n">KeyedCache</span><span class="p">.</span><span class="kc">self</span><span class="p">)</span>
|
|
|
|
<span class="c1">/// ...</span>
|
|
|
|
<span class="c1">/// Create a KeyedCache using the Request container</span>
|
|
<span class="kd">let</span> <span class="nv">cache</span> <span class="p">=</span> <span class="n">req</span><span class="p">.</span><span class="n">make</span><span class="p">(</span><span class="n">KeyedCache</span><span class="p">.</span><span class="kc">self</span><span class="p">)</span>
|
|
<span class="bp">print</span><span class="p">(</span><span class="n">cache</span> <span class="k">is</span> <span class="n">MemoryKeyedCache</span><span class="p">)</span> <span class="c1">// true</span>
|
|
</pre></div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</article>
|
|
</div>
|
|
</div>
|
|
</main>
|
|
|
|
|
|
<footer class="md-footer">
|
|
|
|
<div class="md-footer-nav">
|
|
<nav class="md-footer-nav__inner md-grid">
|
|
|
|
<a href="../futures/" title="Futures" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
|
|
<div class="md-flex__cell md-flex__cell--shrink">
|
|
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
|
|
</div>
|
|
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
|
|
<span class="md-flex__ellipsis">
|
|
<span class="md-footer-nav__direction">
|
|
Previous
|
|
</span>
|
|
Futures
|
|
</span>
|
|
</div>
|
|
</a>
|
|
|
|
|
|
<a href="../cloud/" title="Deployment" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
|
|
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
|
|
<span class="md-flex__ellipsis">
|
|
<span class="md-footer-nav__direction">
|
|
Next
|
|
</span>
|
|
Deployment
|
|
</span>
|
|
</div>
|
|
<div class="md-flex__cell md-flex__cell--shrink">
|
|
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
|
|
</div>
|
|
</a>
|
|
|
|
</nav>
|
|
</div>
|
|
|
|
<div class="md-footer-meta md-typeset">
|
|
<div class="md-footer-meta__inner md-grid">
|
|
<div class="md-footer-copyright">
|
|
|
|
<div class="md-footer-copyright__highlight">
|
|
Copyright © 2018 Qutheory, LLC
|
|
</div>
|
|
|
|
powered by
|
|
<a href="http://www.mkdocs.org">MkDocs</a>
|
|
and
|
|
<a href="https://squidfunk.github.io/mkdocs-material/">
|
|
Material for MkDocs</a>
|
|
</div>
|
|
|
|
|
|
<div class="md-footer-social">
|
|
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
|
|
|
|
<a href="https://twitter.com/@codevapor" class="md-footer-social__link fa fa-twitter"></a>
|
|
|
|
<a href="http://vapor.team/" class="md-footer-social__link fa fa-slack"></a>
|
|
|
|
<a href="https://github.com/vapor" class="md-footer-social__link fa fa-github"></a>
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
</div>
|
|
</footer>
|
|
|
|
</div>
|
|
|
|
<script src="../../assets/javascripts/application.8eb9be28.js"></script>
|
|
|
|
<script>app.initialize({version:"0.17.3",url:{base:"../.."}})</script>
|
|
|
|
|
|
|
|
|
|
<script>!function(e,a,t,n,o,c,i){e.GoogleAnalyticsObject=o,e.ga=e.ga||function(){(e.ga.q=e.ga.q||[]).push(arguments)},e.ga.l=1*new Date,c=a.createElement(t),i=a.getElementsByTagName(t)[0],c.async=1,c.src="https://www.google-analytics.com/analytics.js",i.parentNode.insertBefore(c,i)}(window,document,"script",0,"ga"),ga("create","UA-76177358-4","auto"),ga("set","anonymizeIp",!0),ga("send","pageview");var links=document.getElementsByTagName("a");if(Array.prototype.map.call(links,function(e){e.host!=document.location.host&&e.addEventListener("click",function(){var a=e.getAttribute("data-md-action")||"follow";ga("send","event","outbound",a,e.href)})}),document.forms.search){var query=document.forms.search.query;query.addEventListener("blur",function(){if(this.value){var e=document.location.pathname;ga("send","pageview",e+"?q="+this.value)}})}</script>
|
|
|
|
|
|
</body>
|
|
</html> |