Swift
Vapor
swtws
SeverSideSwift

Vapor as a web framework

More than 1 year has passed since last update.

Vapor as a web framework

この記事は Vapor as a web framework というタイトルで Swift Tweetsにてツイートしたものをまとめて、一部実装イメージコードを追加したものになります。

※ 実装イメージコードは 2.0.0-beta.8 のものです。Vaporは2.0に向けて使用が大幅に変わっており、そのまま書いても動かないことが多いと思うので、あくまでイメージです。

今回はSwift製Webフレームワーク & サーバーである「Vapor」の具体的な機能について話します。Swiftの話というよりはフレームワークの紹介のような感じです。

Vaporの概要

今日はVaporのWebフレームワークとしての機能を簡単に紹介します。詳細は 公式ドキュメント を参照してください。また、https://ookami.connpass.com/event/53331/ にて詳しい話をするつもりなので興味がある方はぜひ。

View

まずはテンプレートエンジンです。Vaporではコミュニティが開発している「Leaf」というテンプレートエンジンを使用すると楽です。初期はかなりひどかったですが、最近改善されて来ているっぽい?
https://github.com/vapor/leaf

AtomやVSCode向けにLeafのシンタックスハイライト用のパッケージも提供されています。Xcodeで弄ってもいいですが私はあまり好きじゃないです。Leafのタグは自分で定義することもできるので、欲しいタグがあったら作れちゃいます。

こんな感じの文法です。

#extend("base")

#export("content") {
    <div>Content</div>

    #equal(lhs, rhs) {
        equal values
    }

    #loop(contents, "content") {
        #(content.name)
    }

    #if(isLoggedIn) {
        isLoggedIn
    } ##else() {
        Guest
    }
}

ORM

次にORMです。Vaporコミュニティが「Fluent」というORMを開発しているのでこれを使うのがとても楽です。MySQL, SQLite, PostgreSQL等で使えます。

Fluentでは、Realmのようにモデルをクラスとして定義します。DBに対する基本的な操作は、メソッドが用意されているのでSQLを書かなくてもDBに対しての処理を簡単に書くことができます。https://github.com/vapor/fluent

こんな感じ

final class User: Model {

    static var idKey: String {
        return "id"
    }

    let storage = Storage()
    let username: String
    let password: String

    init(username: String, hashedPassword: String) {
        self.username = username
        self.password = hashedPassword
    }

    required init(row: Row) throws {
        username = try row.get("username")
        password = try row.get("password")
    }

    func makeRow() throws -> Row {
        var row = Row()
        try row.set("username", username)
        try row.set("password", password)
        return row
    }
}

セッション

次にセッションです。デフォルトではアプリのプロセス上にセッションを保存しますが、Redis用のProviderが提供されているので、Redisに保存することもできます。https://github.com/vapor/redis-provider

let redisCache = try RedisCache(config: drop.config)
let sessions = CacheSessions(redisCache)
drop.middleware.append(SessionsMiddleware(sessions))

セキュリティ周り

次にセキュリティ周り。Vaporではセキュリティ周りのMiddlewareやパッケージを用意しています。例えば、バージョン2.0からは vapor/auth を使ってCookieやトークンを使った認証を簡易化できます。CORSのMiddlewareもあります。

デプロイ

最後にDeploy。Vaporアプリケーションのデプロイには「Flock」を使うと楽です。カスタムタスクを作ってDeployの特定の処理を自分で書くこともできます。https://github.com/jakeheis/Flock

まとめ

Vaporは、Webアプリを作るための機能がそこそこ増えてきてます。まだまだ開発中で頻繁にAPIが変わりますが、初期の頃に比べてどんどんよくなってるのでぜひ使って見てください。Slackのチームもあります。ごTweet聴ありがとうございました。