我从在动态模式下使用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::load_namespaces::HasCache失败-您确定这是一个真实的结果类吗?
我被这个班级布局困住了。BackPAN::Index::Dist、File和Release都是公开记录的。预期许多方法将作为查询的结果返回它们。
我需要一种在静态模式下使用DBIx::Class::Schema::Loader的方法,而使用BackPAN::Index::Dist、File和Release作为结果类。
我一直试图让DBIx::Class::Schema::Loader拼出生成的结果类,而不是依赖load_namespaces搜索子目录。
理想情况下,我希望生成的结果类位于它们自己的子目录中,将Dist、File和Release作为子类,以便于定制。但是,对架构的查询必须返回自定义的子类。
发布于 2012-12-27 08:53:07
通常,您有一个结果和一个ResultSet名称空间,对应的类驻留在其中:
BackPAN::Index::Schema::Result::Dist
BackPAN::Index::Schema::ResultSet::Dist命名空间文档显示了将它们设置为非默认值的示例。
您还可以使用类并指定每个类:
BackPAN::Index::Schema->load_classes({
BackPAN::Index => [qw( Dist File Release )],
});通常,将结果和ResultSet类移动到不同的命名空间并不是一个问题,因为它们总是通过加载它们的架构实例来访问。在使用load_classes之前,我建议尝试移动它们,看看它是否真的破坏了一些东西。
发布于 2012-12-27 10:12:09
我意识到了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)],
});这是一次黑客攻击,但有效。还在寻找更好的解决方案。
https://stackoverflow.com/questions/14051408
复制相似问题