【问题标题】:How do I make DBIx::Class::Schema::Loader ignore non result classes?如何让 DBIx::Class::Schema::Loader 忽略非结果类?
【发布时间】:2012-12-27 08:07:38
【问题描述】:

我正在从在动态模式下使用 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() 类 BackPAN::Index::Role::HasCache 失败 - 你确定这是一个 真正的结果类?

我被这个班级布局所困扰。 BackPAN::Index::DistFileRelease 均已公开记录。许多方法都希望将它们作为查询的结果返回。

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

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

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

【问题讨论】:

    标签: perl dbix-class


    【解决方案1】:

    通常你有一个 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 之前尝试移动它们,看看它是否真的会破坏某些东西。

    【讨论】:

    • 是的,如果我对班级列表进行硬编码,它就可以工作。麻烦的是,DBIC::Schema::Loader 生成了 Schema 类。如何摆脱它的控制?
    • 或者,如果有办法让 DBIC::Schema::Loader 只生成结果类而不是方便的模式。
    • Schema::Loader 假定一个空的命名空间,它在其中生成所有类型的类。修改生成的模式(以及其他类)不仅是支持的,而且是假设的,因为它的目的只是让你开始。
    【解决方案2】:

    我意识到 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)],
    });
    

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

    【讨论】:

      猜你喜欢
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多