Slide 1

Slide 1 text

Vapor as a web framework (2.0 beta) Player! Meetup with IBM(H.27.04.24) @rb_de0

Slide 2

Slide 2 text

自己紹介 @rb_de0 github.com/rb-de0, qiita.com/rb-de0 teamLab.inc iOS エンジニア コミケでiOS/Swift の本出してます

Slide 3

Slide 3 text

こんな本書いてた (C90/H26/08)

Slide 4

Slide 4 text

こんなの作ってた rb-de0/vapor-linebot (LINE ボット, Vapor) rb-de0/tech.reb-dev.com( 簡易CMS のような何か, 直したい,Vapor) rb-de0/Github-Slack-Bot(Github 連携ボット, Kitura) rb-de0/Qiita-Slack-Bot(Qiita 連携ボット, Kitura)

Slide 5

Slide 5 text

話すこと Swift Web Framework 「Vapor」 とは Vapor の各機能をさらっと紹介

Slide 6

Slide 6 text

前提 Vapor 2.0.0-beta.18( くらい) の 話です。 API 結構変わっていて辛い... 2.0 は5 月中旬にリリー ス予定らしい ドキュメント (http://beta.docs.vapor.codes/)

Slide 7

Slide 7 text

Vapor https://github.com/vapor/vapor (github より) A web framework and server for Swift that works on macOS and Ubuntu. “ “

Slide 8

Slide 8 text

Vapor の特徴 Swift 製フレー ムワー クの中ではスター 数が2 番目 に多い(9000 強) フルスタック コミュニティ活発 Slack で気軽に質問できる ドキュメントが割とちゃんとしている( けど怪し いときもある...) 「vapor university」 というチュー トリアルサイト がある

Slide 9

Slide 9 text

導入

Slide 10

Slide 10 text

導入(Mac) CLI ツー ルの導入 $ brew tap vapor/homebrew-tap $ brew update $ brew install vapor # vapor-beta アプリケー ション作成 $ vapor new AppName # --branch=beta Xcode プロジェクト作成 $ vapor xcode

Slide 11

Slide 11 text

ビルド(Mac) Xcode でビルド & 実行 可能 CLI ツー ルを使う場合 ビルド $ vapor build 実行 $ vapor run serve

Slide 12

Slide 12 text

アプリケー ションの作成

Slide 13

Slide 13 text

ディレクトリ初期構成 ProjectRoot/ |- Sources/ | |- Run | |- main.swift ... エンドポイント | |- App | |- Routes.swift ... ルー ティング設定 | |- Setup.swift ... アプリケー ションの設定 | |- Models/ | |- Controllers/ | |- Config/ ... 設定ファイル |- Tests/ ... テストコー ド |- Resources/ ... View ファイル |- Public/ ... js/css 等 |- Package.swift

Slide 14

Slide 14 text

Droplet アプリケー ション本体 ルー ティングの登録, サー バー 起動, Middleware の登 録等を行う [Run/main.swift] let config = try Config() try config.setup() let drop = try Droplet(config) try drop.setup() try drop.run()

Slide 15

Slide 15 text

Setup アプリケー ションの初期化(Provider やMiddleware の追加等) を行う [App/Setup.swift] extension Droplet { public func setup() throws { try collection(Routes()) } } extension Config { public func setup() throws { try addProvider(FluentProvider.Provider.self) preparations += [ User.self ] } }

Slide 16

Slide 16 text

Routing [App/Routes.swift] struct Routes: RouteCollection { func build(_ builder: RouteBuilder) throws { builder.get("/") { _ in return "It works!" } builder.resource("/users", UserController()) } }

Slide 17

Slide 17 text

Leaf Vapor コミュニティが開発しているテンプレー ト LeafProvider が必要 [App/Setup.swift] public func setup() throws { try addProvider(LeafProvider.Provider.self) // 追加 try addProvider(FluentProvider.Provider.self) preparations += [ User.self ] } drop.get("leaf") { request in return try self.view.make("index.leaf", context) }

Slide 18

Slide 18 text

Leaf デフォルトで使えるタグ( 一部) #(variable) #loop(contents, "content") {} #if(bool) {} #equal(lhs, rhs) {} #extend("base") #import("content") #export("content") {} #embed("embeds/header") 独自タグも作成可能

Slide 19

Slide 19 text

Fluent (ORM) Vapor コミニティが開発しているORM デフォルトだとOnMemoryDB final class User: Model, Timestampable { let storage = Storage() let username: String let password: String init(usernamePassWord: Password) { username = usernamePassWord.username password = usernamePassWord.password } 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 } }

Slide 20

Slide 20 text

Fluent (ORM) try User.all() try User.find(10) try User(name: "name", pass: "pass").save() try User.makeQuery().filter("age", .greaterThan, 22).all() try User.makeQuery().sort("age", .descending).all() MySQL を使いたい場合 [App/Setup.swift] try addProvider(MySQLProvider.Provider.self) [Con g/ uent.json] { "driver": "mysql" }

Slide 21

Slide 21 text

Session デフォルトだとOnMemorySession builder.get("/session") { request in request.session?.data["userId"] = "10" return "Set-Cookie" }

Slide 22

Slide 22 text

Persist extension User: SessionPersistable {} [App/Setup.swift] addConfigurable(middleware: { _ in PersistMiddleware(User.self) }, name: "persist-user") [Con g/droplet.json] "middleware": [ "persist-user" ]

Slide 23

Slide 23 text

Redis セッションストアにRedis を使いたい場合 [App/Setup.swift] let redisCache = try RedisCache(config: self) let sessions = CacheSessions(redisCache) addConfigurable(middleware: { _ in SessionsMiddleware(sessions) }, name: "redis-sessions") [Con g/droplet.json] "middleware": [ "redis-sessions" ]

Slide 24

Slide 24 text

Auth 認証/ 認可周りのヘルパー PasswordAuthenticatable extension User: PasswordAuthenticatable { static var usernameKey: String { return "username" } } ログインフロー let credential = try request.userNamePassword() let user = try User.authenticate(credential) try user.persist(for: request)

Slide 25

Slide 25 text

CORS cors.json に 設定を記述するだけ [Con g/cors.json] { "allowedOrigin": "http://allowedOrigin.com", "allowedMethods": ["get", "post"], "allowedHeaders": ["Content-Type"], "cacheExpiration": 600 }

Slide 26

Slide 26 text

Vapor 関連の面白そうなもの

Slide 27

Slide 27 text

Kitura-Provider サー バー 部分をKitura に置き換えるProvider https://github.com/vapor/kitura-provider beta だと動かない UIWebKit Swift からVapor で扱えるView を生成してくれる https://github.com/calebkleveter/UIWebKit

Slide 28

Slide 28 text

VaporForms https://github.com/bygri/vapor-forms HTML のフォー ム周りのヘルパー SteamPress/NSPress https://github.com/brokenhandsio/SteamPress https://github.com/isaced/NSPress Vapor を使って作られたブログエンジン Wordpress のSwift 版?

Slide 29

Slide 29 text

TinyFaces https://tinyfac.es/ https://github.com/maximedegreve/TinyFaces Vapor を使って作られたサー ビス 商用にも使える顔写真を提供するサー ビスらしい

Slide 30

Slide 30 text

vapor-apns/VaporGCM/vapor-gcm https://github.com/matthijs2704/vapor-apns https://github.com/matthijs2704/vapor-gcm https://github.com/shial4/VaporGCM APNs/GCM/FCM に対応したPush 通知基盤の実装

Slide 31

Slide 31 text

所感 2.0 に向けて機能が整備されてきていい感じ まだまだ実装されていない機能 & 細かいバグ があ るので貢献チャンス? 導入実績がもっと増えるといいと思う

Slide 32

Slide 32 text

おわり