繁体   English   中英

如何使DBIx :: Class :: Schema :: Loader忽略非结果类?

[英]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::DistFileRelease全部公开记录。 作为查询的结果,期望有许多方法返回它们。

我需要一种在静态模式下使用DBIx :: Class :: Schema :: Loader的方法 ,同时将BackPAN::Index::DistFileRelease用作结果类。

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

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

通常,您有一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM