Playframework 需要一般视图模式差异化的想法

Playframework 需要一般视图模式差异化的想法,playframework,Playframework,我正在创建一个web应用程序,它将有两种视图模式。一种模式就是普通的网站。另一种查看模式是facebook应用程序。在facebook中,应用程序显示在iframe中。在我的应用程序中,我必须能够检测视图是处于facebook模式还是独立模式。我需要检测到这一点,因为facebook的屏幕更小(760px),所以我需要选择不同的CSS文件,但我也可能会更改某些链接目标、总体布局或某些控制器行为。我想在一台服务器上部署整个应用程序。我不想过早地对应用程序进行分区。我确实知道如何在不同的节点上物理地

我正在创建一个web应用程序,它将有两种视图模式。一种模式就是普通的网站。另一种查看模式是facebook应用程序。在facebook中,应用程序显示在iframe中。在我的应用程序中,我必须能够检测视图是处于facebook模式还是独立模式。我需要检测到这一点,因为facebook的屏幕更小(760px),所以我需要选择不同的CSS文件,但我也可能会更改某些链接目标、总体布局或某些控制器行为。我想在一台服务器上部署整个应用程序。我不想过早地对应用程序进行分区。我确实知道如何在不同的节点上物理地分离这两个视图,例如,如果此服务器是否处于facebook模式,则应用不同的application.conf文件,其中包含一个静态参数。物理分离意味着要测试两种不同的配置,以及两种不同的部署,我希望避免这种情况。所以我在寻找一种更“合乎逻辑”的分离

我有以下想法:

1.)向每个请求“GET/…?facebook=1”添加一个参数,并在@Before方法中提取该参数

这里的缺点是,我必须手动将参数添加到所有后续链接=>讨厌且容易出错

或者,在生成反向路由时,有没有一种方法可以“黑客”路由器这样做

2.)在路径前面加上一些上下文“GET/fb/…”并在操作之前检查它是否存在于@中

这里的缺点是,我需要复制路由,而显示的障碍似乎是反向路由是不明确的,我看不到一种方法来告诉路由器我想要哪条路由

同样,这是一种侵入路由器,在反向路由上添加前缀的方法吗

3.<请在此提出您的建议;)>


谢谢

这可能不是最好的选择,但您可以创建一个主页,接收一个参数,显示它们是否来自Facebook,并在用户会话中存储一些标志。然后根据该参数创建要修改的所有css/js/links/etc的路径。比如:

/public/static/${param}/file.ext


其中${param}可以是FB或NFB,这将决定路径。

这可能不是最佳选项,但您可以创建一个主页,该主页接收一个参数,显示它们是否来自Facebook,并在用户会话中存储一些标志。然后根据该参数创建要修改的所有css/js/links/etc的路径。比如:

/public/static/${param}/file.ext


其中${param}可以是FB或NFB,这将决定路径。

我找到了一个简单的解决方案:我将在Apache负载平衡器的/etc/hosts中为目标机器的主机名添加别名,然后该负载平衡器将facebook子域的所有请求路由到与普通视图下相同的群集主机,但使用别名

然后在我的播放控制器中,我使用@Before操作检查request.domain是否存在“facebook”名称别名:

public class MyController extends Controller {

    static ThreadLocal<Boolean> facebook = new ThreadLocal<Boolean>();

    @Before
    static void globals() {
        facebook.set(request.domain.endsWith("-fb"));
        renderArgs.put("facebook", facebook.get());
    }

    protected static boolean isFacebook() {
        return facebook.get();
    }
}
公共类MyController扩展控制器{
静态ThreadLocal facebook=new ThreadLocal();
@以前
静态void globals(){
set(request.domain.endsWith(“-fb”);
renderArgs.put(“facebook”,facebook.get());
}
受保护的静态布尔值(){
返回facebook.get();
}
}

2个不同的负载平衡器现在可以访问一个单一播放群集。我已经构建了它,到目前为止它运行得非常好。

我找到了一个简单的解决方案:我将在Apache负载平衡器的/etc/hosts中为目标机器的主机名添加别名,然后该负载平衡器将facebook子域的所有请求路由到与普通视图相同的群集主机,但使用别名

然后在我的播放控制器中,我使用@Before操作检查request.domain是否存在“facebook”名称别名:

public class MyController extends Controller {

    static ThreadLocal<Boolean> facebook = new ThreadLocal<Boolean>();

    @Before
    static void globals() {
        facebook.set(request.domain.endsWith("-fb"));
        renderArgs.put("facebook", facebook.get());
    }

    protected static boolean isFacebook() {
        return facebook.get();
    }
}
公共类MyController扩展控制器{
静态ThreadLocal facebook=new ThreadLocal();
@以前
静态void globals(){
set(request.domain.endsWith(“-fb”);
renderArgs.put(“facebook”,facebook.get());
}
受保护的静态布尔值(){
返回facebook.get();
}
}

2个不同的负载平衡器现在可以访问一个单一播放群集。我已经构建了它,到目前为止效果相当不错。

这听起来确实可行,谢谢。我找到了一个不包含游戏会话的解决方案。我有点犹豫是否开始使用session对象。这听起来确实可行,谢谢。我找到了一个不包含游戏会话的解决方案。我有点犹豫是否开始使用session对象。