catalyst::model::adaptor
Post on 05-Jul-2015
3.887 Views
Preview:
DESCRIPTION
TRANSCRIPT
Catalyst::Model::Adaptor
Hideo Kimura (hide-k)
Catalyst のいやんなところ
• component が context に依存してるー>特にModel!
• MyApp::M::Foo にビジネスロジックを実装すると Catalyst でしか使えない
• Test が面倒くさい!
そこで C::M::Adaptor
• 既存クラスを C::Model にしてくれるアダプタークラス
• 必要なのは– Model にしたいクラス
• 超簡単!
作り方
Helperがついてる
script/myapp_create model Foo Adaptor Foo::Class create
package MyApp::Model::Foo;use strict;use warnings;use base 'Catalyst::Model::Adaptor';
__PACKAGE__->config( class => ‘Foo::Class', constructor => ‘create',);
1;
呼び出し方
sub bar : Local { my ($self, $c) = @_; $c->model(‘Foo')->bar;}
普通の Model みたいに使える
コンストラクタ引数の渡し方
config で渡せる
myapp.yml
Model::Foo: args: foo: ... bar: ...
普通の Model と一緒
コンストラクタ引数の注意
デフォルトではコンストラクタの引数に HashRef しか渡せない
$class->new(foo => ‘aaa’, bar => ‘bbb’);
sub mangle_arguments { my ($self, $args) = @_; return %$args; }
ちょっとだけおまじないが必要
Adaptor, Factory, Factory::PerRequest
• C::M::Adaptor– アプリケーション起動時にクラスをインスタンス化
• C::M::Factory– $c->model(‘Foo’)の呼び出しの度にインスタンス化
• C::M::Factory::PerRequest– Factoryと同じだけど、 1 リクエストで最初の呼び出しの時だけインスタンス化
Net::Twitter を Model 化
他にも
• DBIC を使ったビジネスロジッククラスをModel 化して単体テストを可能に
• TheSchwartz を Model 化してキューの監視ツールを Catalyst で作ってみる
• アイデアはキミしだい!
C::Model::Adaptor を使うと
• 既存クラスを簡単に Modelにできるよ
• context から設定も簡単に渡せるよ
• クラスはアプリケーション起動時にインスタンス化されるよ
• ビジネスモデルを C::Modelから追い出せるよ
• Catalystに依存しない Testができるよ
• Catalystは Dispatcherと Engine だけやってればいいよ(サンフランシスコ在住 男性)
• ちょっと小粋ないいやつです
ご静聴ありがとうございましたm(_ _)m
top related