我有几个网站都具有非常相似的功能。它们允许用户注册,登录,输入信用卡信息和其他常见功能。唯一不同的部分是设计(模板)和一些后端管理功能(实质上是登录后的区域将执行不同的任务),每个站点都需要自己的数据库连接信息。有没有办法有效地重用这些代码,所以我不必复制和粘贴?我应该将这些网站指向同一个Catalyst应用程序,然后以某种方式根据Catalyst应用程序上调用的域名以不同方式处理不同的方面。或者只是拥有单独的Catalyst应用程序并复制代码更好,因为一旦登录了站点,就会有所不同。我想知道是否有人曾经做过类似的事情,并知道处理它的最佳方法。谢谢!
答案 0 :(得分:2)
我对此有一些经验。我们有一系列应用程序,它们共享CRUD功能的一些通用基本代码。
您只需配置您的perl路径和TT路径,使得app中的模块和模板覆盖公共repo中的任何等效项,并且app模块可以根据需要继承公共模块,例如:
/var/common
/root
/lib
/and-so-on
/var/myapp1
/root
/lib
/and-so-on
/var/myapp2
/root
/lib
/and-so-on
您的主程序MyApp2.pm
有类似的内容:
use lib '/var/common/lib';
use lib '/var/myapp2/lib'; # use lib behaves like unshift
您的View::TT
配置类似于:
include_path => [ '/var/myapp2/root', '/var/common/root' ];
您的模块可以执行以下操作:
package MyApp2::Controller::Foo;
use base 'Common::Controller::Foo';
...如果您想使用大部分Common Foo但是覆盖某些方面。
使用include_path
设置,您可以共享常见的模板内容,并以相同的方式覆盖它:
[%- PROCESS bar.tt -%]
如果存在,则
会输出/var/myapp2/root/bar.tt
,如果不存在,则会返回/var/common/root/bar.tt
。
我们发现这非常优雅,有效,最重要的是,DRY。
<强>更新强>
回答有关继承/覆盖的评论路径中的问题的示例:
package MyApp2::Controller::Foo;
use strict;
use warnings;
use base 'Common::Controller::Foo';
sub baz :Local {
my ($self, $c) = (shift, shift);
# set something up that's peculiar to MyApp2's implementation of baz
$c->stash->{bazconfig} = { ... };
# ...
$self->SUPER::baz($c,@_);
# do something else peculiar
# ...
}
sub quux :Local {
my ($self, $c) = (shift, shift);
# completely override the Common quux action
# etc
# ...
}
1;