![](/img/trans.png)
[英]Catalyst: How do I make DBIx::Class::Schema::Loader::make_schema_at() static preserve case?
[英]How do I make DBIx::Class::Schema::Loader ignore non result classes?
我从以动态模式使用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::Dist
, File
和Release
全部公开记录。 作为查询的结果,期望有许多方法返回它们。
我需要一种在静态模式下使用DBIx :: Class :: Schema :: Loader的方法 ,同时将BackPAN::Index::Dist
, File
和Release
用作结果类。
我一直在尝试使DBIx :: Class :: Schema :: Loader拼出生成的结果类,而不是依靠load_namespaces
搜索子目录。
理想情况下,我希望将生成的结果类放在自己的子目录中,并将Dist
, File
和Release
作为子类,以便于自定义。 但是,对模式的查询必须返回定制的子类。
通常,您有一个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之前查看它是否真的破坏了某些内容。
我意识到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)],
});
它是一个hack,但可以。 仍在寻找更好的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.