我正在使用动态模式下的DBIx::Class::Schema::Loader切换到静态模式。
但是有一个问题,我的结果类与非结果类混在一起。 Here's the specifics
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() class BackPAN :: Index :: Role :: HasCache失败 - 你确定这是一个 真实的结果类?
我坚持这个班级布局。 BackPAN::Index::Dist
,File
和Release
都是公开记录的。由于查询,许多方法都会返回它们。
我需要一种在静态模式下使用DBIx::Class::Schema::Loader的方法,而BackPAN::Index::Dist
,File
和Release
用作结果类。
我一直试图让DBIx::Class::Schema::Loader拼出生成的结果类,而不是依靠load_namespaces
来搜索子目录。
理想情况下,我希望生成的结果类位于自己的子目录中,Dist
,File
和Release
作为子类,以便于自定义。但是,针对模式的查询必须返回自定义的子类。
答案 0 :(得分: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之前尝试移动它们并查看它是否真的破坏了。
答案 1 :(得分:0)
我意识到Schema :: Loader的重要部分是创建结果类。架构很简单,我可以手工制作。不幸的是,没有办法告诉Schema :: Loader不生成架构。我把它告诉了make a dummy and just delete the file。
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";
然后我手工编写schema class。
package BackPAN::Index::Schema;
use strict;
use warnings;
use base 'DBIx::Class::Schema';
__PACKAGE__->load_classes({
"BackPAN::Index" => [qw(Dist File Release)],
});
它是一个黑客,但它的工作原理。仍在寻找更好的解决方案。