Provider
The Provider protocol creates a simple and predictable way for adding functionality and third party packages to your Vapor project.
Adding a Provider
Adding a provider to your application takes 2-3 steps.
Add Package
All of Vapor's providers end with the -provider syntax. You can see a list of available providers by searching on our GitHub.
To add the provider to your package, add it as a dependency in your Package.swift file.
let package = Package(
name: "MyApp",
dependencies: [
.Package(url: "https://github.com/vapor/vapor.git", majorVersion: 1, minor: 0),
.Package(url: "https://github.com/vapor/mysql-provider.git", majorVersion: 1, minor: 0)
]
)
It's important to
vapor cleanorvapor build --cleanafter adding new packages.
Import
Once the provider has been added, you can import it using import VaporFoo where Foo is the name of the provider.
Here is what importing the MySQL provider looks like:
import Vapor
import VaporMySQL
let drop = Droplet()
try drop.addProvider(VaporMySQL.Provider.self)
// ...
drop.run()
Every provider comes with a class named Provider. Append the Type of this class to your providers array in the Droplet's init method.
Config
Some drivers may require a configuration file. For example, VaporMySQL requires a Config/mysql.json file like the following:
{
"host": "localhost",
"user": "root",
"password": "",
"database": "vapor"
}
You will receive an error during the Droplet's initialization if a configuration file is required.
Advanced
You may choose to initialize the provider yourself.
import Vapor
import VaporMySQL
let drop = Droplet()
let mysql = try VaporMySQL.Provider(host: "localhost", user: "root", password: "", database: "vapor")
drop.addProvider(mysql)
...
drop.run()
Create a Provider
Creating a provider is easy, you just need to create a package with a class Provider that conforms to Vapor.Provider.
Example
Here is what a provider for an example Foo package would look like. All the provider does is take a message, then print the message when the Droplet starts.
import Vapor
public final class Provider: Vapor.Provider {
public let message: String
public let provided: Providable
public convenience init(config: Config) throws {
guard let message = config["foo", "message"].string else {
throw SomeError
}
try self.init(message: message)
}
public init(message: String) throws {
self.message = message
}
public func afterInit(_ drop: Droplet) {
}
public func beforeServe(_ drop: Droplet) {
drop.console.info(message)
}
}
This provider wil require a Config/foo.json file that looks like:
{
"message": "The message to output"
}
The provider can also be initialized manually with the init(message: String) init.