【问题标题】:catalyst app template toolkit different config per domain催化剂应用程序模板工具包每个域的不同配置
【发布时间】:2013-05-10 15:28:23
【问题描述】:

我正在构建一个Catalyst 应用程序,我想使用Template Toolkit 作为我的模板系统。但是,我的应用程序将响应许多域,并且根据域,它会显示具有不同 Template Toolkit 配置的不同内容。本质上,如果我有 domain.com 和 domain2.com,我希望每个都有自己的配置。有谁知道一种优雅的方式来做到这一点,同时仍然能够使用Catalyst 的查看功能?谢谢!

更新

通过将它放在根控制器中,我发现我可以在配置中更改站点包装器 Template Toolkit 对象。然而,它似乎只是使用了位于lib/myapp/View/HTML.pm 的初始包装器(我猜是因为它只是使用了初始化它的包装器)。有没有办法让它认识到我改变了这个请求的包装器?

sub begin :Private {
    my ($self, $c) = @_;

    $c->view('HTML')->config->{WRAPPER} = $c->req->uri->host . '/site/wrapper';
}

【问题讨论】:

    标签: perl view catalyst template-toolkit


    【解决方案1】:

    我倾向于直接在每个主模板中声明WRAPPER,而不是像这样全局声明。

    [%- WRAPPER c.req.uri.host _ '/site/wrapper.tt'; -%]
    

    ...我发现它提供了更大的灵活性。


    不过……

    另一个我取得了巨大成功的选项是使用自定义模板路径,以便您的模板的特定域版本可以覆盖默认值,如果它们存在的话。这为您提供了极大的灵活性,可以根据需要注入代码的变体。

    === MyApp::View::TT.pm ===

    sub process {
        my ($self, $c) = @_;
    
        # capture original path, identify host
        my @orig_include_path = @{$self->include_path};
        my $domain = $c->req->uri->host;
    
        # augment every path with domain/path
        @{$self->include_path} = map { ("$domain/$_", $_) } @orig_include_path;
    
        $self->SUPER::process($c);
    
        # revert path
        @{$self->include_path} = @orig_include_path;
    }
    

    其最终结果是每次调用 WRAPPERPROCESSINCLUDE 都会检查特定领域的版本或生成通用版本,即

    [%- WRAPPER wrapper.tt -%]
    

    将找到$domain/wrapper.tt 或回退到wrapper.tt 如果没有这样的文件。这会自动扩展到:

    • foo/bar/baz.tt
    • domain1/foo/bar/baz.tt
    • domain2/foo/bar/baz.tt

    希望有用。

    【讨论】:

      【解决方案2】:

      从历史上看,最好的想法可能是:https://metacpan.org/release/Catalyst-TraitFor-Component-ConfigPerSite,它提供了为每个站点/主机指定配置的能力。因此您可以指定单独的视图/包装器/数据库连接等。

      【讨论】:

        猜你喜欢
        • 2012-12-03
        • 1970-01-01
        • 2013-01-09
        • 2021-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-23
        • 2022-01-25
        相关资源
        最近更新 更多