您的问题与需要桌面版和移动版的网站非常相似。您可以研究用于此的解决方案。
我们通过创建一个 AppController 来构建类似的东西,它在 beforeFilter() 方法中设置一个变量(在你的情况下检查请求域),并在 render 方法中使用这个变量来选择要使用的布局和视图文件:
function render($action = null, $layout = null, $file = null) {
$view_file = false;
$layout_file = false;
// test for availability of layout does not work for null so set to default setting of null.
if ($layout === null) {
$layout = $this->layout;
}
// if not mobile: show desktop version.
if (!$this->is_mobile) {
$view_file = file_exists(VIEWS . $this -> name . DS . 'desktop/' . $file . '.ctp');
$layout_file = file_exists(LAYOUTS . 'desktop/' . $layout . '.ctp');
}
return parent::render($action, ($layout_file ? 'desktop/' : '') . $layout, ($view_file ? 'desktop/' : '') . $file);
}
这样,如果 is_mobile 为 false,则使用子目录“桌面”中的视图/布局而不是默认视图/布局。您可以使用同一系统为 2 个域创建单独的视图/布局。
我们通过覆盖 render() 而不是使用有时也建议的 afterFilter() 来做到这一点。我忘记了真正的原因,但知道这是因为我们无法像我们想要的那样使用 afterFilter() ;-)