将CGI迁移到框架的最佳方法是什么?

时间:2008-09-29 09:10:16

标签: perl model-view-controller cgi catalyst

我有一个在perl CGI中运行的大型Web应用程序。它运行正常,编写得很好,但是就像过去一样,所有的html都是在CGI调用中定义的硬编码,所以你可以想象,它很难保持,改进等等所以现在我想开始添加一些模板并与框架(催化剂或CGI ::应用程序)集成。我的问题是:这里有人有这样的经历吗?有什么我必须注意的事情吗?我知道使用这两个框架我可以运行原生CGI脚本,所以它很好,因为我可以同时运行这两个(CGI原生广告“框架”代码)而没有任何创伤。有什么提示吗?

5 个答案:

答案 0 :(得分:10)

首先编写测试(例如使用Test::WWW::Mechanize)。然后,当你改变一些东西时,你总会知道某些东西是否破裂,以及它是什么破坏了。

然后将HTML提取到模板中,并将常用的子提取到模块中。之后,切换到框架是一块蛋糕。

一般情况下,请逐步进行,以便始终拥有正常运行的应用程序。

答案 1 :(得分:4)

从CGI脚本中的处理逻辑中提取HTML。识别影响HTML输出的所有代码,因为它们是成为模板变量的候选者。将其分成HTML文件,标识的部分标有模板变量。最终,您将能够重构页面,以便在代码开始时完成所有处理,并在所有处理结束时调用HTML模板。

答案 2 :(得分:3)

在这种情况下,从头开始重写,旧代码对A)测试很有用,而B)设计细节很有用。理想情况下,您要为要复制的所有基本功能进行一组测试,或者至少进行解析最终结果页面的测试,以便您可以看到新代码为相同的输入返回相同的信息。

代码中的设计细节可能毫无用处,具体取决于框架自动处理的程度。如果你有一套很好的测试,并且直接转换效果很好,那么你就完成了。如果新的行为与旧的不符,你可能需要深入研究“为什么?”而这可能是一些奇怪的东西,乍一看没有意义。

首先要记住的一件事是,找出是否有人在你正在使用的框架中做了类似的事情。你可以节省很多时间和金钱。

答案 3 :(得分:3)

以下是我使用Python而不是Perl的方法,但这无关紧要:

  1. 将HTML和代码分离为不同的文件。我为此使用了模板引擎
  2. 代码创建函数,它使用一组参数呈现模板
  3. 以合理的方式组织功能(我称之为视图,灵感来自Django)。 (管理员视图,用户视图等)视图都遵循相同的调用约定
  4. 重构数据库并请求内容,以便视图 仅包含视图特定代码(读取:处理GET,POST请求等,但没有任何低级别!)。为此严重依赖现有的图书馆。
  5. 我现在在这里。 :-)下一个明显的步骤当然是:

    • 编写调度程序,将网址映射到视图。这也将导致更好的URL和更好的404和错误处理当然。

答案 4 :(得分:3)

框架的一个假设是url映射到代码。例如,在框架中,您经常会看到以下内容:

http://app.com/docs/list
http://app.com/docs/view/123

通常虽然旧的CGI脚本不能像那样工作,但你更有可能拥有类似的东西:

http://app.com/docs.cgi?action=view&id=123

要利用该框架,您可能需要更改所有网址。无论你是否能够做到这一点,以及如何保持旧链接的运作,都可能构成你决定的很大一部分。

此外,框架还支持某种ORM(对象关系映射器),它可以抽象数据库调用,并且只允许您处理对象。对于Catalyst,这通常是DBIx::Class。您应该评估切换成本的成本。

您可能会发现要使用旧代码作为参考平台进行完全重写。这可能比你预期的要少得多。但是,从一些玩具网站开始,感受一下您决定使用的框架/模板/模板。