読者です 読者をやめる 読者になる 読者になる

Catalyst::Model::Adapterを使ってみたよ

=>追加記事 >>使えなかったので、いろいろやってみたよ(続・Model::Adapter使ってみたよ)

CatalystでDBを普通のRDBとかを使わずにYAMLファイルをDBみたいな感じにしたいと思って、Adapterを使ってモデルクラスを作ってみました。(自分の設計が変なせいですが)

参考にしたページ(感謝です!!)

で、自分が打ち込んだヘルパーのコマンド。

./script/MyApp_create.pl model YAML::Loader Adaptor YAML::Loader new

これで、まず最初の型ができます。コンストラクタのnewは、なくても大丈夫。デフォルトでnewだから。もしnew以外なら設定が必要。

これでパーペキと思い、さぁ実行!!

 ./script/MyApp_server.pl -r
Couldn't instantiate component "MyApp::Model::YAML::Loader", "Can't locate object method "1" via package "YAML::Loader" at /usr/lib/perl5/site_perl/5.8.8/YAML/Base.pm line 13." at ./script/MyApp_server.pl line 53
Compilation failed in require at ./script/MyApp_server.pl line 53.

あれ??こけたよ。

調べると、Adaptor::Baseクラスの_create_instanceメソッドのreturnの中にある$self->mangle_arguments($args)にて引数を何も設定していないと1が返却されていたので、このメソッドをオーバライドして、1が返ってこないようにしたら、エラーが起きなくなりました。

package MyApp::Model::YAML::Loader;
use strict;
use warnings;
use base 'Catalyst::Model::Adaptor';

__PACKAGE__->config(
    class       => 'YAML::Loader',
    constructor => 'new',
);

#なぜか1が設定されるのでオーバライド
sub _create_instance {
    my ($self, $app) = @_;
    my $constructor = $self->{constructor} || 'new';
    my $args = $self->prepare_arguments($app);
    my $adapted_class = $self->{class};

    return $adapted_class->$constructor();
}

1;


今のところは、これで解決しているが、今後変更が必要かも。

=>追加記事 >>使えなかったので、いろいろやってみたよ(続・Model::Adapter使ってみたよ)

[>Catalyst::Model::AdaptorでTheSchwartzをModel化
[>>Catalyst::Model::Adaptorを使ってみた