我正在尝试在同一目录级别的多个催化剂应用程序之间共享组件。
例如,如果我有一个应用程序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
中的模型的操作?
答案 0 :(得分:1)
为此,你需要做两件事。
下面我详细介绍一种可能的方法。根据您的需求,有很多不同的方法可以做到这一点。
创建一个包含通用模型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 CPAN或Install Modules Manually cpanm我使用cpanm,因为它可以直接从git安装。