在同一文件系统层次结构中的应用程序之间共享催化剂

时间:2014-03-07 16:50:50

标签: perl catalyst

我正在尝试在同一目录级别的多个催化剂应用程序之间共享组件。

例如,如果我有一个应用程序AppOne,模型的类层次结构可能如下所示:

AppOne ::型号:: DB

文件系统层次结构如下所示:

./lib/AppOne/Model/DB.pm

并在AppOne控制器中使用它(例如AppOne::Controller::Foo.pm):

$c->model('DB::SomeTable')->all()

如果我有第二个AppTwo应用程序,它与AppOne构建在同一个文件系统中,是否可以在AppTwo控制器中使用AppOne :: Model :: DB.pm?

换句话说,如何告诉./lib/AppTwo/Controller/Root.pm中我想要使用.lib/AppOne/Models中的模型的操作?

2 个答案:

答案 0 :(得分:1)

为此,你需要做两件事。

  1. 启动Catalyst应用程序的脚本需要能够在Perl库路径中找到模型(即@INC)
  2. 您需要将Catalyst配置为在通常可以找到的地方之外重复使用其他模型。
  3. 下面我详细介绍一种可能的方法。根据您的需求,有很多不同的方法可以做到这一点。

    创建一个包含通用模型AppOne和AppTwo的“超级项目”或文件夹。 AppOne和AppTwo是两个具有默认文件夹结构的常规Catalyst项目。要存储公共模型,请在“超级项目”中创建文件夹common / lib。

    修改AppOne / script / appone_server.pl(或者您用来启动Catalyst服务器的其他脚本,以便它可以找到common / lib文件夹。您可以这样做添加行

    use FindBin;
    use lib "$FindBin::Bin/../../common/lib"; # now AppOne can find the lib.
    

    将Catalyst模型添加到名为CommonModel的AppOne / lib / Model中。

    package AppOne::Model::CommonModel;
    
    use strict;
    use base 'Catalyst::Model::DBIC::Schema';
    __PACKAGE__->config(
        schema_class => 'CommonSchema', # name of the schema class in common/lib    
        connect_info => {
            # connect info here
        }
    );
    

    也为AppTwo重复最后两步。

    如上所述,这是一种方法。它假定您将通过将整个超级项目复制到服务器来部署应用程序,并且目录结构将完全相同。

答案 1 :(得分:0)

我想这已经回答了,但我也会回答。

在MyApp / lib / MyApp / Model / ADMIN.pm

package MyApp::Model::ADMIN;
use strict;

use lib "/sharedloc/perlmodules/AdminModel/lib";

use AdminModel; 
use base 'Catalyst::Model::DBIC::Schema';

__PACKAGE__->config(
    schema_class => 'AdminModel',

    connect_info => {
        dsn => 'dbi:mysql:administrationdb:mysql.example.com',
        user => 'user',
        password => 'password',
        AutoCommit => q{1},
    }    );

并在您的控制器或任何人

$c->model('ADMIN::User')->search;

您的模型应使用DBIx :: Class架构加载器创建,而不是h2xs或其他perl模块创建者。

mkdir AdminModel
cd AdminModel
perl -MDBIx::Class::Schema::Loader=make_schema_at,dump_to_dir:./lib \
    -e 'make_schema_at("AdminModel", { debug => 1 }, \
    [ "dbi:mysql:administrationdb:mysql.example","user", "password" ])'

如果你有很多自定义模块,你可以在MyApp / lib / MyApp.pm或者你正在使用的任何启动脚本(server.pl或fastcgi.pl)中添加它们,或者用cpan或cpanm安装它们。 / p>

我个人更喜欢将自定义perl模块中的所有共享实用程序完全置于催化剂骨架之外。然后应用程序在运行时获取它需要的任何库。对于模型,使用DBIx :: Class :: Schema,以及其他所有使用h2xs或module-starter(或任何你想要的)构建模块的模型。 Tar它们,您可以使用cpan或cpanm安装它们。 Install Modules Manually CPANInstall Modules Manually cpanm我使用cpanm,因为它可以直接从git安装。