Deadboltは、開発者を特定のスタイルに強制しないようにかなりニュートラルなままですが、この場合はmeta
引数を使用して情報を制約に渡すことができます。定義は
object DynamicAction {
def apply(name: String, meta: Option[Any] = None): DynamicAction.DynamicActionBuilder = DynamicActionBuilder(name, meta)
case class DynamicActionBuilder(name: String, meta: Option[Any] = None) extends DeadboltActionBuilder {
override def apply[A](bodyParser: BodyParser[A])(block: AuthenticatedRequest[A] => Future[Result])(implicit handler: DeadboltHandler) : Action[A] =
deadboltActions.Dynamic(name, meta, handler)(bodyParser)(block)
}
}
ので、あなたのコントローラ機能は、この
def getProject(projectId: Int) = actionBuilder.DynamicAction(name = "checkProject", meta = Some(projectId)).defaultHandler() {
authRequest =>
//retrieves project
}
ようになります。これは、(私はその名前を嫌いに来て、私はいくつかの将来のバージョンでそれを変更することがあります)DynamicResourceHandler
を取得しますですこの機能
def isAllowed[A](name: String,
meta: Option[Any] = None,
deadboltHandler: DeadboltHandler,
request: AuthenticatedRequest[A]): Future[Boolean]
の実装を呼び出すあなたはmeta
値のためasInstanceOf
を使用する必要があります。
より複雑な要件の場合は、データを組み立てたもの(ケースクラスまたはマップなど)をmeta
引数として渡すことができます。
答えをありがとう。それは私がそれをやろうと思っていたようなものでした。私はコントローラの代わりにルートにデッドボルトを使用する方法についても読んでいましたが、そこではパラメータ値に正しくアクセスすることは難しいでしょうか? – nmat
実際、ルートでは、メタをハードコードすることしかできません。また、URLを独自に解析して値を取得することもできますが、すでにかなり重くなっています。 –