Scalaのアプリケーションフレームワーク"Lift" (3: SiteMap)

Scalaのアプリケーションフレームワーク"Lift" (2: アプリ構築)
は作者の都合により、後日に掲載します。

SiteMapの役割

  • ページのアクセス権限管理
  • ページのグループ化

SiteMapの定義はBootクラスのboot関数で行われ、 アプリの立ち上げ時に一度だけ読み込まれます。

SiteMapの定義方法(Simply Lift バージョン)

//返り値がSiteMap型の関数を定義
def sitemap():SiteMap = ...
//setSiteMapFuncの引数に、定義した関数を実行する関数オブジェクトを与える。
LiftRules.setSiteMapFunc(() => sitemap())

SiteMapの定義方法(デフォルトプロジェクトバージョン)

//List[ConvertableToMenu]を定義、setSiteMapの引数に変換。
val entries = List(Menu.i("Home") / "index", Menu.i("SP Home") / "sp" / "login")
LiftRules.setSiteMap(SiteMap(entries: _*))

こっちのほうがオススメです。
setSiteMapをコメントアウトすれば、アクセス管理は行われません。

SiteMapの実態

SiteMapはMenuのインスタンスのコレクション。
MenuはLoc[_]と複数のMenuインスタンス(0~n)をサブメニューとして持つ。
メニューはそれぞれ固有の名前を持つ。
Menu.iメソッドはLoc[Unit]を持つMenuインスタンスを生成する.

サブメニュー、グループ化、アクセス管理

//サブメニュー
Menu.i("Info") / "info" submenus(
  Menu.i("About") / "about",
  Menu.i("Contact") / "contact")
LiftRules.setSiteMap(SiteMap(entries: _*))

//グループ化<span class="lift:Menu.group?group=bottom"></span>こんな風に使うらしい
Menu.i("About") / "about" >> LocGroup("bottom")

//アクセス管理
//ログインしていなかったら、ログイン画面に飛ばす、などを制御。(この場合は強制で飛ばしている)
//実際はSessionVarを継承したobjectなどを使って、ログインしているかを確認する。
val hasLogined_? = If(() => true, () => RedirectResponse("/login"))
Menu.i("Home") / "index" >> hasLogined_?

まとめ

原則、LiftではBootクラスでアクセス可能なhtmlを指定し、 必要に応じて、詳細なアクセス権限を定義します。

グループ化や、サブメニューなども定義できますが、 フッターやヘッダーはどうせテンプレートを使って一度しか定義しないので、 わざわざ使うことあるかなぁという感じです。

アクセス管理はSessionVarが出てきてからでないと、 イメージがわかないと思いますが、中々便利です。

SiteMap周りは下手に機能が充実している分、 かえって扱いにくくなってる気がします。

アクセス管理に集中して利用するのが吉。