Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Vapor as a web framework

Aa5bb886fb40a2f777414c66beec62c4?s=47 rbde0
April 24, 2017

Vapor as a web framework

Aa5bb886fb40a2f777414c66beec62c4?s=128

rbde0

April 24, 2017
Tweet

More Decks by rbde0

Other Decks in Programming

Transcript

  1. Vapor as a web framework (2.0 beta) Player! Meetup with

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

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

  4. こんなの作ってた 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)
  5. 話すこと Swift Web Framework 「Vapor」 とは Vapor の各機能をさらっと紹介

  6. 前提 Vapor 2.0.0-beta.18( くらい) の 話です。 API 結構変わっていて辛い... 2.0 は5

    月中旬にリリー ス予定らしい ドキュメント (http://beta.docs.vapor.codes/)
  7. Vapor https://github.com/vapor/vapor (github より) A web framework and server for

    Swift that works on macOS and Ubuntu. “ “
  8. Vapor の特徴 Swift 製フレー ムワー クの中ではスター 数が2 番目 に多い(9000 強)

    フルスタック コミュニティ活発 Slack で気軽に質問できる ドキュメントが割とちゃんとしている( けど怪し いときもある...) 「vapor university」 というチュー トリアルサイト がある
  9. 導入

  10. 導入(Mac) CLI ツー ルの導入 $ brew tap vapor/homebrew-tap $ brew

    update $ brew install vapor # vapor-beta アプリケー ション作成 $ vapor new AppName # --branch=beta Xcode プロジェクト作成 $ vapor xcode
  11. ビルド(Mac) Xcode でビルド & 実行 可能 CLI ツー ルを使う場合 ビルド

    $ vapor build 実行 $ vapor run serve
  12. アプリケー ションの作成

  13. ディレクトリ初期構成 ProjectRoot/ |- Sources/ | |- Run | |- main.swift

    ... エンドポイント | |- App | |- Routes.swift ... ルー ティング設定 | |- Setup.swift ... アプリケー ションの設定 | |- Models/ | |- Controllers/ | |- Config/ ... 設定ファイル |- Tests/ ... テストコー ド |- Resources/ ... View ファイル |- Public/ ... js/css 等 |- Package.swift
  14. Droplet アプリケー ション本体 ルー ティングの登録, サー バー 起動, Middleware の登

    録等を行う [Run/main.swift] let config = try Config() try config.setup() let drop = try Droplet(config) try drop.setup() try drop.run()
  15. 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 ] } }
  16. Routing [App/Routes.swift] struct Routes: RouteCollection { func build(_ builder: RouteBuilder)

    throws { builder.get("/") { _ in return "It works!" } builder.resource("/users", UserController()) } }
  17. 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) }
  18. Leaf デフォルトで使えるタグ( 一部) #(variable) #loop(contents, "content") {} #if(bool) {} #equal(lhs,

    rhs) {} #extend("base") #import("content") #export("content") {} #embed("embeds/header") 独自タグも作成可能
  19. 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 } }
  20. 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" }
  21. Session デフォルトだとOnMemorySession builder.get("/session") { request in request.session?.data["userId"] = "10" return

    "Set-Cookie" }
  22. Persist extension User: SessionPersistable {} [App/Setup.swift] addConfigurable(middleware: { _ in

    PersistMiddleware(User.self) }, name: "persist-user") [Con g/droplet.json] "middleware": [ "persist-user" ]
  23. 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" ]
  24. 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)
  25. CORS cors.json に 設定を記述するだけ [Con g/cors.json] { "allowedOrigin": "http://allowedOrigin.com", "allowedMethods":

    ["get", "post"], "allowedHeaders": ["Content-Type"], "cacheExpiration": 600 }
  26. Vapor 関連の面白そうなもの

  27. Kitura-Provider サー バー 部分をKitura に置き換えるProvider https://github.com/vapor/kitura-provider beta だと動かない UIWebKit Swift

    からVapor で扱えるView を生成してくれる https://github.com/calebkleveter/UIWebKit
  28. VaporForms https://github.com/bygri/vapor-forms HTML のフォー ム周りのヘルパー SteamPress/NSPress https://github.com/brokenhandsio/SteamPress https://github.com/isaced/NSPress Vapor を使って作られたブログエンジン

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

  30. 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 通知基盤の実装

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

  32. おわり