perl - 将 Perl CGI 迁移到模板工具包的策略?

标签 perl templates migration cgi toolkit

我有一个相对较大的遗留 Perl/CGI/DBI Web 应用程序,它会逐个生成 HTML。我们正在修改正在生成的 HTML,以符合 HTML 5/CSS 3。这将是转移到某种模板系统的好时机。我们不想进行完全重写,因此不想迁移到 Catalyst 等框架。

我在想 Perl Template Toolkit 可能是我们影响最小的方法。我正在重新阅读古老的獾书以研究可行性。

我的问题是这个。这里有人将“老派”Perl Web 代码迁移到 Template Toolkit 吗?您是否可以分享任何技巧来最大程度地减少所需的重写/返工?我们也没有 100% 决定使用 Template Toolkit。如果有我们应该考虑的替代方案?

具体来说,我们要解决什么问题?我们正在生成无效的 HTML,需要对其进行清理。由于我们正在清理,我们希望生成完全有效的 HTML 5,并在可行的范围内生成有效的 CSS3 和 Javascript。我们通过 jQuery 使用 jQuery、jQuery UI 小部件和 AJAX。我们有典型的页面 Controller MVC 架构,除了没有 View 层。我们希望使用某种模板系统,但不想重写所有内容(或大部分内容!)以进行迁移。

谢谢你!
Ed Barnard,明尼苏达州坎农福尔斯

最佳答案

这是我发现的,因为我已经将我的实践从 CGI.pm 转移到 TT,以及我在使用 HTML::Mason、HTML::Template、Text::Template 和使用的过程中学到的东西Rails 中的 ERB 和 HAML。

  • 显示中包含的逻辑越多,特别是如果它是用特定于显示的语言编写的,那么您将获得的乐趣就越少。
  • 我开始更喜欢 HAML 以减少模板内容的大小 [在 HAML 中,缩进暗示结束标签]
  • 在进入模板之前,使用应用程序的本地语言执行尽可能多的逻辑来计算页面的各种动态位。 [调用 View 方法,在进行渲染之前]。
  • 关于(3),通过使用方法,而不是内联显示/渲染逻辑,您可以使您的模板具有声明性,因此虽然您可能在渲染中间执行逻辑,但您的模板没有一堆 IF/THEN/ELSE 逻辑导致困惑。

  • 让我们想象一个由页眉、页脚和正文组成的相当小的、人为的网页。让我们假设页脚是完全静态的,每次加载新页面时正文都会更改,但页眉仅在用户登录/注销时才会更改。

    您可以想象包含如下代码的 header :
    <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>
    

    但从长远来看,您最好在 header.tt 中执行此操作:
    <header>
      [% user_info($user) |html %]
    </header>
    

    这在 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>)
    }
    

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

    关于perl - 将 Perl CGI 迁移到模板工具包的策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13536997/

    相关文章:

    perl - 在 Perl 中,如何在数组中找到给定值的索引?

    perl - 什么是打印<<EOF;它是如何工作的?

    regex - Perl 中的 qr/STRING/操作符如何决定是否编译 STRING?

    xml - XML XPath 1.0-如何在XPath表达式中正确使用'not'函数

    c++模板或+运算符从指针创建 vector

    c++ - 使用模板的 undefined symbol

    头文件中的 C++ 模板

    entity-framework - ...可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束

    php - 变量变量处理顺序: changes in PHP 7

    java - 从 Google Java API 数据存储迁移到 Mysql