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



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

例如,如果我有一个应用程序appone,则模型的类层次结构可能看起来像:

appone :: Model :: DB

和文件系统层次结构看起来像这样:

./lib/AppOne/Model/DB.pm

并将其用于AppOne控制器(例如AppOne::Controller::Foo.pm):

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

如果我有第二个应用程序apptwo,该应用程序是在与Appone相同的文件系统继承系统中构建的,是否可以在Apptwo Controller中使用Appone :: Model :: DB.PM?

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

为此,您需要两件事。

  1. 启动催化剂应用程序的脚本需要能够在perl库路径(即@inc)
  2. 中找到该模型
  3. 您需要配置催化剂以在通常会找到的地方重新使用其他模型。

下面我详细介绍了一种可能的方法。根据适合您的需求,有很多不同的方法。

创建一个包含通用模型,appone和apptwo的"超项目"或文件夹。Appone和Apptwo是具有默认文件夹结构的两个普通催化剂项目。存储共同模型在"超级项目"中创建文件夹/lib。

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

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

将催化剂模型添加到称为CommonModel的Appone/lib/模型。

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的最后两个步骤。

如前所述,这是一种方法。它假设您只需将整个超级项目复制到服务器,并且目录结构将完全相同。

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

在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 Schema Loader而不是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或模块启动器(或任何您想要的任何内容)构建模块。将它们抛光,您可以使用CPAN或CPANM安装它们。安装模块手动CPAN或安装模块手动使用CPANM我使用CPANM,因为它可以直接从git安装。

相关内容

最新更新