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: 2),
.Package(url: "https://github.com/vapor/mysql-provider.git", majorVersion: 2)
]
)
Warning
Always run vapor update or vapor clean after editing your Package.swift file.
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 MySQLProvider
Add to Droplet#
Every provider comes with a class named Provider. Add this class to your Droplet using the addProvider method.
let config = try Config()
try config.addProvider(MySQLProvider.Provider.self)
let drop = try Droplet(config)
// ...
drop.run()
Configuration#
Some drivers may require a configuration file. For example, MySQLProvider requires a Config/mysql.json file like the following:
{
"hostname": "localhost",
"user": "root",
"password": "",
"database": "vapor"
}
You will receive an error during the Droplet’s initialization if a configuration file is required.
Tip
Storing sensitive configuration files (ones that contain passwords) in the Config/secrets folder will prevent them from being tracked by git.
Manual#
Some providers can be configured manually by using the Provider’s init method. This method can be used instead of configuration files.
let mysqlProvider = VaporMySQL.Provider(host: "localhost", user: "root", password: "", database: "vapor")
try config.addProvider(mysqlProvider)
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 convenience init(config: Config) throws {
guard let message = config["foo", "message"].string else {
throw ConfigError.missing(key: ["message"], file: "foo", desiredType: String.self)
}
self.init(message: message)
}
public init(message: String) {
self.message = message
}
public func boot(_ drop: Droplet) { }
public func beforeRun(_ 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.