✎ Edit on GitHub

# 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.