Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Vapor as a web framework

More than 3 years have 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聴ありがとうございました。

rb-de0
都内のどこかでiOSアプリケーション開発しています。Swift楽しいです。
dwango
Born in the net, Connected by the net.
https://dwango.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away