4

我正在从动态模式下使用DBIx::Class::Schema::Loader切换到静态模式。

但是有一个问题,我的结果类与非结果类混合在一起。 这是细节

lib/BackPAN/Index.pm            # main API
lib/BackPAN/Index/Dist.pm       # result class
lib/BackPAN/Index/File.pm       # result class
lib/BackPAN/Index/Release.pm    # result class
lib/BackPAN/Index/Schema.pm     # subclass of DBIC::Schema::Loader
lib/BackPAN/Index/Role/...      # various roles

当我切换到静态模式生成时,它会被角色绊倒。

DBIx::Class::Schema::load_namespaces(): 尝试 load_namespaces() 类 BackPAN::Index::Role::HasCache 失败 - 你确定这是一个真正的结果类吗?

我被这个班级布局困住了。BackPAN::Index::DistFile并且Release都是公开记录的。许多方法都希望将它们作为查询的结果返回。

我需要一种在静态模式下使用DBIx::Class::Schema::LoaderBackPAN::Index::Dist while 的方法,File并将Release其用作结果类。

我一直在尝试让DBIx::Class::Schema::Loader拼出生成的结果类,而不是依靠load_namespaces搜索子目录。

理想情况下,我希望生成的结果类位于它们自己的子目录中DistFileRelease作为子类以便于定制。但是,针对模式的查询必须返回自定义的子类。

4

2 回答 2

2

通常,您有一个 Result 和一个 ResultSet 命名空间,相应的类驻留在其中:

BackPAN::Index::Schema::Result::Dist
BackPAN::Index::Schema::ResultSet::Dist

DBIx ::Class::Schema#load_namespaces文档显示了将它们设置为非默认值的示例。

您还可以使用DBIx::Class::Schema#load_classes并指定每个类:

BackPAN::Index::Schema->load_classes({
    BackPAN::Index => [qw( Dist File Release )],
});

通常,将 Result 和 ResultSet 类移动到不同的命名空间中没有问题,因为它们总是通过加载它们的 Schema 实例来访问。我建议在使用 load_classes 之前尝试移动它们,看看它是否真的会破坏某些东西。

于 2012-12-27T08:53:07.163 回答
0

我意识到 Schema::Loader 的重要部分是制作结果类。架构很简单,我可以手工制作。不幸的是,没有办法告诉 Schema::Loader 不要生成模式。我通过告诉它做一个虚拟并删除文件来绕过它。

DBIx::Class::Schema::Loader::make_schema_at(
    'BackPAN::Index::SchemaThrowaway',
    {
        result_namespace => '+BackPAN::Index',
        use_namespaces   => 1,
        dump_directory   => 'lib',
    },
);

# Throw the generated schema away.
unlink "lib/BackPAN/Index/SchemaThrowaway.pm";

然后我手动编写模式类

package BackPAN::Index::Schema;

use strict;
use warnings;

use base 'DBIx::Class::Schema';

__PACKAGE__->load_classes({
    "BackPAN::Index" => [qw(Dist File Release)],
});

它是一个黑客,但它有效。仍在寻找更好的解决方案。

于 2012-12-27T10:12:09.343 回答