将Perl CGI迁移到Template Toolkit的策略?

Edw*_*ard 11 migration perl templates cgi toolkit

我有一个相对较大的传统Perl/CGI/DBI Web应用程序,它可以一个接一个地生成HTML.我们正在重新制作正在生成的HTML,以符合HTML 5/CSS 3.这是转向某种模板系统的好时机.我们不想进行完全重写,因此不希望迁移到Catalyst等框架.

我认为Perl模板工具包可能是我们影响最小的手段.我正在重读"古老的Badger Book"以研究可行性.

我的问题是这个.有没有人在这里将"旧学校"Perl Web代码迁移到Template Toolkit?您是否有任何技巧可以分享,以尽量减少重写/返工?我们还没有100%决定使用Template Toolkit.如果有替代方案我们应该考虑?

具体来说,我们试图解决什么问题?我们正在生成无效的HTML并需要清理它.由于我们正在清理,我们希望生成完全有效的HTML 5,并且在可行的范围内,生成有效的CSS3和Javascript.我们通过jQuery使用jQuery,jQuery UI小部件和AJAX.我们有典型的页面控制器MVC架构,除了没有View层.我们想去某种模板系统,但不想重写所有东西(或许多东西!)进行迁移.

谢谢!Ed Barnard,Cannon Falls MN

Len*_*ffe 10

这是我发现的,因为我已将我的练习从CGI.pm转移到TT,以及我在使用HTML :: Mason,HTML :: Template,Text :: Template和使用的方式中学到的东西. Rails中的ERB和HAML.

  1. 您在显示器中使用的逻辑越多,特别是如果它以显示特定语言编写,您将获得的乐趣就越少.
  2. 我更喜欢HAML减少模板内容的大小[在HAML中,缩进隐含了结束标签]
  3. 在您使用应用程序的本机语言放入模板之前,执行尽可能多的逻辑来计算页面的各种动态位.[调用视图方法,在进行渲染之前].
  4. 关于(3),通过使用方法而不是内联显示/呈现逻辑,您可以使模板具有声明性,因此当您可能在渲染过程中执行逻辑时,您的模板没有一堆IF/THEN/ELSE逻辑导致混乱.

让我们想象一个由标题,页脚和正文组成的相当小的,人为的网页.让我们假设页脚是完全静态的,每次加载新页面时主体都会更改,但只有当用户登录/注销时标题才会更改.

你可以想象包含这样的代码的标题:

<header>
[% IF $user.is_logged_in THEN %]
   Hello [% $user.name %] - <a href="/logout/user/[% $user.id %]">Log Out</a>
[% ELSE %]
   Please <a href="/user/login">Log In</a>
[% END %]
</header>
Run Code Online (Sandbox Code Playgroud)

但是你最好在header.tt中做这件事:

<header>
  [% user_info($user) |html %]
</header>
Run Code Online (Sandbox Code Playgroud)

这在View :: Helpers :: Header.pm中:

sub user_info {
   my $user = shift;
   if ($user->{is_logged_in} ) {
     return "Hello $user->{name} - " . logout_link($user->{id});
   }
   else {
     return "Please " . login_link();
   }
}

sub logout_link {
  my $userid = shift;
  return qq(<a href="/logout/user/[% $userid %]">Log Out</a>)
}
Run Code Online (Sandbox Code Playgroud)

当然,您可以在TT而不是纯Perl中实现视图助手,我没有任何类型的数字,但如果您已经在Perl中完成了所有逻辑,则可以将Perl重构为模块(如果它不存在),而不是在TT中重新编码.

  • 谢谢你,Len!我非常同意你的四个要点(除了我从未使用过HAML).大多数域逻辑都在.pm模块中.我们宁愿在纯Perl中尽可能多地实现.这是一个UI(用户界面)刷新而不是重写!这就是为什么我认为TT是一个很好的选择,因为我们仍然允许使用纯Perl.您在模板下使用Perl的示例正是我所需要的.我希望它(相对)那么容易.Ed(现在我知道Return发表评论) (3认同)