2012-12-27 3 views
4

나는 동적 모드에서 DBIx::Class::Schema::Loader을 정적으로 전환하고 있습니다.DBIx :: Class :: Schema :: Loader가 non-result 클래스를 무시하도록하려면 어떻게해야합니까?

하지만 문제가 있습니다. 결과 클래스가 결과가 아닌 클래스와 섞여 있습니다. 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 :: 클래스 :: 스키마 :: load_namespaces() : load_namespaces() 클래스 BackPAN :: 지수 :: 역할 :: HasCache 실패에 대한 시도 - 당신이이 실제 결과 클래스입니다 확신?

나는이 클래스 레이아웃을 고수했다. BackPAN::Index::Dist, FileRelease은 모두 공개적으로 문서화되었습니다. 많은 메소드가 쿼리의 결과로 반환 할 것으로 예상됩니다.

나는 BackPAN::Index::Dist, FileRelease이 결과 클래스로 사용하는 동안 정적 모드로 DBIx::Class::Schema::Loader를 사용하는 방법이 필요합니다.

나는 DBIx::Class::Schema::Loaderload_namespaces에 의존하지 않고 생성 된 결과 클래스를 철자로하여 서브 디렉토리를 검색하려고 노력했습니다.

이상적으로는 생성 된 결과 클래스를 Dist, FileRelease과 같은 하위 디렉토리에 포함시켜보다 쉽게 ​​사용자 정의 할 수 있습니다. 그러나 스키마에 대한 쿼리는 사용자 지정된 하위 클래스를 반환해야합니다.

BackPAN::Index::Schema::Result::Dist 
BackPAN::Index::Schema::ResultSet::Dist 

DBIx::Class::Schema#load_namespaces 문서는 기본값이 아닌 값으로 설정하는 예를 보여

답변

2

는 보통 해당 클래스가 존재하는 결과와 ResultSet의 네임 스페이스를 가지고있다.

또한 DBIx::Class::Schema#load_classes를 사용하여 각 클래스를 지정할 수 있습니다

BackPAN::Index::Schema->load_classes({ 
    BackPAN::Index => [qw(Dist File Release)], 
}); 

은 일반적으로 그들이 항상로드 스키마의 인스턴스를 통해 액세스 할 수 있기 때문에 다른 네임 스페이스에 결과와의 ResultSet 클래스를 이동하는 문제가 아니다. 나는 load_classes를 사용하기 전에 그것들을 옮기고 정말로 무언가를 깨뜨리는 지 확인하려고한다.

+0

예, 클래스 목록을 하드 코딩하면 작동합니다. 문제는 DBIC :: Schema :: Loader가 Schema 클래스를 만든다는 것입니다. 그것으로부터 어떻게 통제를 벗어날 수 있습니까? – Schwern

+0

또는 DBIC :: Schema :: Loader를 만들 수있는 방법이있는 경우에만 결과 클래스를 만들고 편리 할 스키마는 만들지 마십시오. – Schwern

+1

Schema :: Loader는 모든 유형의 클래스를 생성하는 빈 네임 스페이스를 사용합니다. 생성 된 스키마 (및 다른 클래스)를 수정하는 것은 지원되는 것이 아니라 시작 목적으로 사용되기 때문에 가정됩니다. –

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)], 
}); 

해킹하지만 작동합니다. 더 나은 솔루션을 찾고 있습니다.

관련 문제