首页 > 解决方案 > perl - 替代模板系统的包模块

问题描述

我构建了一个 Web 服务,而不是使用像工具包这样的模板系统,我使用这样的包模块:

创建页面 url,根据先前在路由中创建的 url,在独立模块中的每个页面,作为参数传递给每个模块一个唯一的哈希引用,其中包含全局标题、页脚和所有其他数据的变量,其中每个页面(模块)中相同.

主文件

use strict;
use warnings;

use Handler;    

my %mvs = (# my variables
     username         => $set{user},
     titleglobal      => '|  web System ',
     ip               => $env->{REMOTE_ADDR}
     .........
     ......... 
   );


for my $module_url (reverse @all_urls_names ) {
  $router->add($module_url, sub {
     $module_url->new(\%mvs);
   })      
} 

在模块页面中,我有其他模块加载 header.pm、footer.pm 但 body.pm 直接加载到当前模块页面中,在本例中为 Handler.pm

处理程序.pm

package Handler;

use strict;
use warnings;

use Layout::Head;
use Layout::Footer;


my $layout = sub {

my ($head, $body, $footer) = ( Head::new($mvs), thebody($mvs), Footer::new($mvs) );

return <<THE_HTML;

$head

$body

$footer

THE_HTML
};

 return [ 200, [ "Content-Type" => "text/html" ], [ $layout->() ] ];

}


sub thebody{

.........
.........

}

我已经完成了这种方法,将 wordpress 布局作为参考,一切正常。

¿这是构建可维护代码的好方法吗?

注意:我选择这种方式是因为我不想安装更多的模块。(用最少的必要代码解决给定的问题(更少的调试代码 - 明显的加速)

标签: perl

解决方案


你说你的约束不是安装模块。但是,安装预写模块和创建新模块之间的实际区别是什么?

也许您在部署方面遇到问题。这是可以理解的。但是,您可以使用诸如Carton之类的东西来创建应用程序。在系统上设置所有内容,您可以灵活地部署到您没有的系统。

使用许多 CPAN 模块,您可以直接从发行版中获取库并重用它们。如果他们不使用 XS 或需要外部库(例如,openssl),他们可以开箱即用。我不特别建议这个,但它是可行的。您将获得经过广泛测试的模块以及随之而来的社区支持。调试的代码更少,因为其他人已经完成了这项工作!这些东西是复杂的系统,您将不得不做很多工作,不仅要调试您已经完成的工作,还要发现您应该完成和支持的所有其他事情。我自己重新发明了一些东西,我吸取了教训。

每个人最终都会编写自己的模板系统(每个人都应该作为他们生活经历的一部分)。没关系。但是,您应该研究其他系统的功能以及它们是如何做的,这样您就不会重复他们的错误。一些模板模块小而简单,可以作为您探索的基础。例如,查看Text::Template:它是两个模块文件,没有依赖关系。通过这个练习,你可以看到你正在尝试做的事情的隐藏深度和复杂性。

如果你正在制作一个 web 框架,你看过Mojolicious吗?它是一个自包含系统,只需要核心 Perl 模块(尽管您可能仍需要其他东西,如数据库连接等)。它有一个很好的模板系统。对于重量更轻的东西(但你能轻多少),你的方法看起来像CGI::Prototype。看看那个。

最后,因为担心安装任何东西而避免使用模块可能是您只需要面对并克服它的事情。几乎任何系统一开始都有点吓人,在你使用它并了解它是如何工作的之后会变得更好。您可能不喜欢 CPAN(但“喜欢”与完成工作有什么关系?),但也许您已经可以从系统包中获得所需的东西。最后,您希望完成更多工作。前面的一点工作可以为您节省大量的工作。

当您在安装模块时遇到问题时,我们随时为您提供帮助!:)


推荐阅读