Vapor4に対応するべくVapor3のGETメソッドを書き換えてみる

Leaf
のGETメソッドを書き換えてみる

はじめに

Vapor3のプロジェクトをVapor4に対応させるべく、パッケージのアップデートやフレームワーク周りの書き換えをしてみました。

この時点でroutes.swiftはエラーの嵐です。公式サイトにもある通りメソッドがかなり変わっています。これを一つずつ潰していきます。プログラミングには粘り強さが不可欠です。

GETメソッドの書き換えをしてみる

文字列を返すだけのもの

Vapor4
app.get { req in
    return "It works!"
}

GETメソッドで単純に文字列を返してもらうものについては、書き換えは非常に単純です。
もともとrouter.getとなっていたものをapp.getとするだけです。

単純。これなら他のメソッドも簡単ですね。と言いたいところですが、そうは簡単に行かないのがいつものことなので、浮かれずに進めていきましょう。

Leafテンプレートのレンダリングをするもの

Leafテンプレートのレンダリングをするものはちょっと複雑です。複雑というよりも、Leafテンプレートの名称を把握さえ出来ていれば大丈夫です。

Vapor3
app.get("new") { req in
  return try req.view().render("AddBook")
}
Vapor4
app.get("new") { req in
  req.view.render("AddBook")
}

テンプレートが無いと言われた!

書き換え自体は単純です。ですが、テンプレートの保存先に注意が必要です。Leafテンプレートの名称だけ把握できていれば楽勝と思っていたのですが、そうは問屋が卸さない。
そのままビルドしてテンプレートのレンダリングをしようとすると、テンプレートファイルが見つからない旨のエラーが出ます。

LeafKit.LeafError.Reason.noTemplateExists([テンプレートファイル名])

ちゃんとプロジェクトディレクトリにあるし、XCodeのファイルツリーにも表示されているのになんで?となってしまいますが、これはビルドされたディレクトリ内にテンプレートファイルが無いことによるものです。

Leafテンプレートをどこに置いておけばよいか?

app.leaf.configuration.rootDirectoryで示されたディレクトリに置いてください。

私の場合は上記ディレクトリに対してプロジェクトディレクトリ内のテンプレートを置いた場所のシンボリックリンクをはっておきました。

表示できました。見た目が変わってないようですが、ちゃんとVapor4に対応させて表示させたものですよ。

Vapor4でも無事に表示されました

そういえば、Vapor3のときはLeafテンプレートが自動的に配置されていたんでしょうかね?Vapor4に移行するとなった以上、今はVapor3の深掘りをしないでおきましょう。

まとめ

どんなプロジェクトでもそうだと思いますが、バージョンアップに伴う修正と書き換えは骨が折れます。既存のものと動きが変わらないようにしないといけないですからね。

だからこそ、テストは大切です。面倒になって書いてないと、こういう時に苦労します。