現在、DBIx::Class::Schema::Loaderを使用して、一連の Result クラスを生成および再生成します (db スキーマが変更された場合)。
これらのクラスの下部に追加の関係とメソッドを追加します。これにより、人々がスキーマを再生成または変更すると、マージ地獄が発生します。
カスタムの変更を、自動生成されたファイルと並行して配置される別のファイル セットに維持したいと考えています。
これを行うためのシンプルでクリーンな推奨方法はありますか?
現在、DBIx::Class::Schema::Loaderを使用して、一連の Result クラスを生成および再生成します (db スキーマが変更された場合)。
これらのクラスの下部に追加の関係とメソッドを追加します。これにより、人々がスキーマを再生成または変更すると、マージ地獄が発生します。
カスタムの変更を、自動生成されたファイルと並行して配置される別のファイル セットに維持したいと考えています。
これを行うためのシンプルでクリーンな推奨方法はありますか?
私は同じ問題に遭遇しました。生成されたクラスから継承する別のクラスを作成するだけです。ただし、テーブル参照と関係を編集中のクラスにプルオーバーする必要がありますが、列の定義と生成されたクラスにないものを残すことができます。基本的に、クラスを「Immutable」名前空間に生成し、テーブル名参照と生成されたモデルからの関係とともに「Mutable」名前空間に各クラスの子を作成するローダーのヘルパーを作成しました。それはかなりうまく機能しているようで、開発者がクラスの生成されたセクションを編集することを心配する必要はもうありません。私はおそらく、最近のブログ投稿にすべてを書き留めるべきです。
スキーマを Moosify してから、schema->connection(); の直後にスキーマ クラスに適用する一連の Moose::Roles を作成することで解決しました。
次のようになります。
my $schema = My::Schema->connection();
foreach my $source ($schema->sources) {
my $domain_pkg = "My::Domain::$source";
eval "require $domain_pkg";
# ignore failures due to file-not-found
if ($@ && $@ =~/^Can't locate.*INC/) {
# but barf if class doesnt compile
} elsif ($@) {
confess "Failed to load $domain_pkg for $pkg!!: - $@";
# re-register domain class with the resultsource
# and apply the role
} else {
my $schema_pkg = "${pkg}::$source";
$c->register_class($source, $schema_pkg);
use Moose::Util;
# check schema is moosyfied
if ( $schema_pkg->can('meta') ) {
my $meta = $schema_pkg->meta;
eval {
Moose::Util::apply_all_roles($meta, $domain_pkg);
};
if ($@) {
confess "Failed to add $domain_pkg role to $schema_pkg: $@\n";
} else {
l4p->info("Found and applied Domain role: '$domain_pkg' for schema: '$schema_pkg'");
}
} else {
warn "Cant call meta on $schema_pkg. ";
}
}
}
近く..
use MooseX::Declare
role My::Domain::Person {
# modify schema
My::Schema::Person->inflate_column( ..);
My::Schema::Person->belongs_to(..);
My::Schema::Person->set_primary_key(..);
# add some method modifiers to check/modify construction
around new (ClassName $class : $params) {
munge params..
$self->$orig($params);
}
# post insert hook
after insert () {
do_something..
}
# domain methods
sub fullname {
$self->firstname.' '.$self->surname;
}
}