Vapor GitHub

You're viewing documentation for an older version. View the latest version

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 clean or vapor build --clean after 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.