Catalyst重用具有多个站点的应用程序代码

时间:2014-05-08 04:21:15

标签: perl catalyst

我有几个网站都具有非常相似的功能。它们允许用户注册,登录,输入信用卡信息和其他常见功能。唯一不同的部分是设计(模板)和一些后端管理功能(实质上是登录后的区域将执行不同的任务),每个站点都需要自己的数据库连接信息。有没有办法有效地重用这些代码,所以我不必复制和粘贴?我应该将这些网站指向同一个Catalyst应用程序,然后以某种方式根据Catalyst应用程序上调用的域名以不同方式处理不同的方面。或者只是拥有单独的Catalyst应用程序并复制代码更好,因为一旦登录了站点,就会有所不同。我想知道是否有人曾经做过类似的事情,并知道处理它的最佳方法。谢谢!

1 个答案:

答案 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;