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

Vapor as a web framework

rbde0
April 24, 2017

Vapor as a web framework

rbde0

April 24, 2017
Tweet

More Decks by rbde0

Other Decks in Programming

Transcript

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

    月中旬にリリー ス予定らしい ドキュメント (http://beta.docs.vapor.codes/)
  2. Vapor の特徴 Swift 製フレー ムワー クの中ではスター 数が2 番目 に多い(9000 強)

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

    update $ brew install vapor # vapor-beta アプリケー ション作成 $ vapor new AppName # --branch=beta Xcode プロジェクト作成 $ vapor xcode
  4. ディレクトリ初期構成 ProjectRoot/ |- Sources/ | |- Run | |- main.swift

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

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

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

    rhs) {} #extend("base") #import("content") #export("content") {} #embed("embeds/header") 独自タグも作成可能
  10. 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 } }
  11. 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" }
  12. Persist extension User: SessionPersistable {} [App/Setup.swift] addConfigurable(middleware: { _ in

    PersistMiddleware(User.self) }, name: "persist-user") [Con g/droplet.json] "middleware": [ "persist-user" ]
  13. 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" ]
  14. 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)