我构建了一个Web服务,而不是使用像工具包这样的模板系统,而是使用了像这样的包模块:
创建页面url,独立模块中的每个页面根据之前在路由中创建的url, 作为参数传递给每个模块一个唯一的哈希引用,该哈希引用具有用于全局标题,页脚以及所有其他数据的变量,每个页面(模块)中的数据都相同。
main.pl
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
Handler.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布局作为参考,使用了这种方法,一切都很好。
?这是构建可维护代码的好方法吗?
注意:之所以选择这种方式,是因为我不想安装更多模块。 (以最少的必要代码量解决了给定的问题(更少的代码可调试-明显的加速)
答案 0 :(得分:5)
您说您的约束不是安装模块。但是,在安装预写模块和创建新模块之间的实际区别是什么?
也许您在部署时遇到问题。这是可以理解的。但是,您可以使用诸如Carton之类的东西来创建应用程序。在可以灵活部署到不需要的系统上的系统上设置所有内容。
使用许多CPAN模块,您可以直接从发行版中获取库并重新使用它们。如果他们不使用XS或需要外部库(例如,openssl),则可以立即使用。 我没有特别建议,但这是可行的。您将获得经过广泛测试的模块及其随附的社区支持。调试代码更少,因为其他人已经完成了工作!这些都是复杂的系统,您将需要做大量的工作,不仅要调试已经完成的工作,还要发现您应该完成并支持的所有其他工作。自己重新发明了一些东西之后,我学到了教训。
每个人最终都会编写自己的模板系统(每个人都应将其作为生活经验的一部分)。没关系。但是,您应该研究其他系统的功能以及它们的工作方式,以免重复错误。一些模板模块既小又简单,可以作为您探索的基础。例如,检出Text::Template:这是两个模块文件,没有依赖性。通过本练习,您可以了解要执行的操作所隐藏的深度和复杂性。
如果您要制作网络框架,您是否看过Mojolicious?它是一个独立的系统,仅需要核心Perl模块(尽管您可能仍然需要其他功能,例如数据库连接等)。它具有一个不错的模板系统。对于较轻的重量(但可以减轻多少重量),您的方法看起来像CGI::Prototype。看一看。
最后,避免模块是因为您急于安装任何东西,这可能只是您需要面对并克服的问题。几乎所有系统一开始都会有些恐怖,在您使用它并了解其工作原理之后会变得更好。您可能不喜欢CPAN(但是“喜欢”与完成工作有什么关系?),但是也许您已经可以从系统软件包中获得所需的东西。最后,您想完成更多的工作。只需在前端进行一些工作,最后就可以节省大量工作。
当您遇到安装模块方面的问题时,我们将为您提供帮助! :)
答案 1 :(得分:3)
这是构建可维护代码的好方法吗?
否。
在系统的心脏,您的Perl代码中嵌入了HTML(也许还有CSS和Javascript)。当您仅维护站点时,这似乎是一个好主意,但是当您成功完成工作而需要一个单独的前端开发团队时,您将意识到这是一个糟糕的主意。
此外,您正在重新发明轮子。 CPAN上有许多出色的Web框架和模板系统。许多年来,其中大多数已被许多人用于生产。它们将具有比您的代码更多的功能,并且将经过更好的测试。
您说您正在这样做是因为您不想安装更多模块。我敦促您重新考虑这种方法。大多数现代的Perl编程都是将正确的CPAN模块组合在一起。您将不必要地限制语言的功能。