如何在Circumflex中编写自己的匹配器?

时间:2011-07-10 17:44:24

标签: scala

正如here所述,我只有在满足条件时才需要运行Circumflex动作。目前,我这样做:

get("/") = requireLogin {
    ...
}

现在Circumflex支持Matchers,它可以放在get()规范中:

get("/mail" & Host("localhost"))

如何编写自己的匹配器,以上requireLogin更接近Circumflex风格?我想写这样的东西:

get("/" & IsLoggedIn) = {
    ...
}

1 个答案:

答案 0 :(得分:0)

这是一个简单的实现。所需要的只是定义一个具有所需名称的对象,从AtomicMatcher扩展(因为这个实现add()等)并实现nameapply方法:

object IsLoggedIn extends AtomicMatcher {
    def name = "IsLoggedIn"

    def apply = {
        // Not shown: figuring out whether user is logged in or not
        if(loggedIn) {
            Some(List(new MatchResult(name)))
        }
        else {
            sendRedirect("/login")
            throw new ResponseSentException;
        }
    }
}

如果用户已登录(即可以执行操作),则需要返回至少一个MatchResult的列表。如果您不想执行该操作,请执行其他操作,然后返回None或抛出ResponseSentExceptionwhich seems to be the preferred way