Tutorial: How to use Leaf

Tutorial: How to use Leaf

1. Create a new project

Vapor toolbox is so nice it let’s you easily create new projects using any git-repo as a template. Since we will build upon the outcome of the aforementioned tutorial, we will create a new project using it as a template:

vapor new projectName --template=vaporberlin/my-first-route

NOTE: You can see what vapor toolbox is all capable of by typing vapor --helpin your terminal :)

Our command will create a project with the name projectName using my-first-route from vaporberlin as a template (thanks vapor toolbox ).


2. Generate the Xcode project

// swift-tools-version:4.0
import PackageDescription
let package = Package(
name: "projectName",  // changed
  dependencies: [
    .package(url: "https://github.com/vapor/vapor.git", from: "3.0.0"),
    .package(url: "https://github.com/vapor/leaf.git", from: "3.0.0")  // added
  ],
  targets: [
    .target(name: "App", dependencies: ["Vapor", **"Leaf"**]),
    .target(name: "Run", dependencies: ["App"]),
    .testTarget(name: "AppTests", dependencies: ["App"]),
  ]
)

Now in the terminal at the root directory projectName/ execute:

vapor update -y

It may take a bit fetching the dependency, generating the Xcode project and opening it for you. But when done you should have a project structure like this:

projectName/
├── Package.swift
├── Sources/
│   ├── App/
│   │   ├── app.swift
│   │   ├── boot.swift
│   │   ├── configure.swift
│   │   └── routes.swift
│   └── Run/
│       └── main.swift
├── Tests/
├── Public/
├── Dependencies/
└── Products/

If you see an error including “CNIOOpenSSL” when cmd+r you’re missing a dependency. Just run brew upgrade vapor and re-generate the project* ✌*


3. Configure your project to use Leaf

We will have to register the **LeafProvider **within our configure.swift:

import Vapor
import Leaf  // added
public func configure(
  _ config: inout Config,
  _ env: inout Environment,
  _ services: inout Services
) throws {
  // Register routes to the router
  let router = EngineRouter.default()
  try routes(router)
  services.register(router, as: Router.self)
  let leafProvider = LeafProvider()    // added
  try services.register(leafProvider)  // added
  config.prefer(LeafRenderer.self, for: ViewRenderer.self)
}

And also to set the **LeafRenderer **as our preferred ViewRenderer This will allow us to access the renderer from within our routes very easy.


4. Create your first template / view

Our view renderer leaf is expecting a directory called Resources/ and right underneath it a directory called Views/ to hold all view-files. So you will end up with a folder structure like this:

projectName/
├── Package.swift
├── Sources/
│   ├── App/
│   │   ├── app.swift
│   │   ├── boot.swift
│   │   ├── configure.swift
│   │   └── routes.swift
│   └── Run/
│       └── main.swift
├── **Resources/**
│   └── **Views/**
├── Tests/
├── Public/
├── Dependencies/
└── Products/

NOTE: They have to be directories (blue) and not groups (yellow). I created them in terminal with mkdir -p Resources/Views/

You may have to re-generate your Xcode project with vapor xcode -y in order to let Xcode see your new directories. When done in **Resources/Views/ **create a new file named welcome.leaf with following code:



  
    Leaf
  
   

Welcome to my first leaf template!

NOTE: Select welcome.leaf and go to Editor>Syntax Coloring>HTML


5. Implement a route to serve the view

In your routes.swift add a new route and call it.. hmmm..

import Vapor
public func routes(_ router: Router) throws {
  router.get("name") { req in
    return "Ethan Hunt"
  }
  router.get("age") { req in
    return 23
  }
  router.get("json") { req in
    return Person(name: "Martin J. Lasek", age: 26)
  }
  router.get("view") { req -> Future in
    return try req.view().render("welcome")
  }
}
struct Person: Content {
  var name: String
  var age: Int
}

The function req.view() creates and returns a ViewRenderer. And since we configured LeafRenderer as our ViewRenderer we can use .leaf files !

If you now hit cmd + r or the play button on top of Xcode, it will start the application. The console in Xcode tells you where. For me it’s localhost:8080.

If you now fire up localhost:8080/view in your browser you will get a view served using Leaf as a templating language!

6. BONUS: Passing data to the view

It’s super easy to pass data into a view. And this is how it looks like:

import Vapor
public func routes(_ router: Router) throws {
  router.get("name") { req in
    return "Ethan Hunt"
  }
  router.get("age") { req in
    return 23
  }
  router.get("json") { req in
    return Person(name: "Martin J. Lasek", age: 26)
  }
  router.get("view") { req -> Future in
    return try req.view().render("welcome")
  }
  router.get("bonus") { req -> Future in
    let data = ["name": "Ethan", "age": "26"]
    return try req.view().render("whoami", data)
  }
}
struct Person: Content {
  var name: String
  var age: Int
}

If you now create a new file in Resources/Views/ called **whoami.leaf **you can access the passed data in it like so:



  
    Leaf
  
  
    

You rule #(name)! Can't believe you're already #(age)!

If you have a class or struct that conforms to content your are also able to pass an instance of it into the view like so:

import Vapor
public func routes(_ router: Router) throws {
  router.get("name") { req in
    return "Ethan Hunt"
  }
  router.get("age") { req in
    return 23
  }
  router.get("json") { req in
    return Person(name: "Martin J. Lasek", age: 26)
  }
  router.get("view") { req -> Future in
    return try req.view().render("welcome")
  }
  router.get("bonus") { req -> Future in
    let developer = Person(name: "Martin", age: 26)
    return try req.view().render("whoami", developer)
  }
}
struct Person: Content {
  var name: String
  var age: Int
}

Now re-run your application and fire up localhost:8080/bonus
That’s it! You successfully implemented a leaf template project !


7. Where to go from here

You can find a list of all tutorials with example projects on Github here:
https://github.com/vaporberlin/vaporschool


你可能感兴趣的:(Tutorial: How to use Leaf)