Download - Catalyst::Model::Adaptor
![Page 1: Catalyst::Model::Adaptor](https://reader038.vdocuments.pub/reader038/viewer/2022100604/55987dd01a28abf57d8b462d/html5/thumbnails/1.jpg)
Catalyst::Model::Adaptor
Hideo Kimura (hide-k)
![Page 2: Catalyst::Model::Adaptor](https://reader038.vdocuments.pub/reader038/viewer/2022100604/55987dd01a28abf57d8b462d/html5/thumbnails/2.jpg)
Catalyst のいやんなところ
• component が context に依存してるー>特にModel!
• MyApp::M::Foo にビジネスロジックを実装すると Catalyst でしか使えない
• Test が面倒くさい!
![Page 3: Catalyst::Model::Adaptor](https://reader038.vdocuments.pub/reader038/viewer/2022100604/55987dd01a28abf57d8b462d/html5/thumbnails/3.jpg)
そこで C::M::Adaptor
• 既存クラスを C::Model にしてくれるアダプタークラス
• 必要なのは– Model にしたいクラス
• 超簡単!
![Page 4: Catalyst::Model::Adaptor](https://reader038.vdocuments.pub/reader038/viewer/2022100604/55987dd01a28abf57d8b462d/html5/thumbnails/4.jpg)
作り方
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;
![Page 5: Catalyst::Model::Adaptor](https://reader038.vdocuments.pub/reader038/viewer/2022100604/55987dd01a28abf57d8b462d/html5/thumbnails/5.jpg)
呼び出し方
sub bar : Local { my ($self, $c) = @_; $c->model(‘Foo')->bar;}
普通の Model みたいに使える
![Page 6: Catalyst::Model::Adaptor](https://reader038.vdocuments.pub/reader038/viewer/2022100604/55987dd01a28abf57d8b462d/html5/thumbnails/6.jpg)
コンストラクタ引数の渡し方
config で渡せる
myapp.yml
Model::Foo: args: foo: ... bar: ...
普通の Model と一緒
![Page 7: Catalyst::Model::Adaptor](https://reader038.vdocuments.pub/reader038/viewer/2022100604/55987dd01a28abf57d8b462d/html5/thumbnails/7.jpg)
コンストラクタ引数の注意
デフォルトではコンストラクタの引数に HashRef しか渡せない
$class->new(foo => ‘aaa’, bar => ‘bbb’);
sub mangle_arguments { my ($self, $args) = @_; return %$args; }
ちょっとだけおまじないが必要
![Page 8: Catalyst::Model::Adaptor](https://reader038.vdocuments.pub/reader038/viewer/2022100604/55987dd01a28abf57d8b462d/html5/thumbnails/8.jpg)
Adaptor, Factory, Factory::PerRequest
• C::M::Adaptor– アプリケーション起動時にクラスをインスタンス化
• C::M::Factory– $c->model(‘Foo’)の呼び出しの度にインスタンス化
• C::M::Factory::PerRequest– Factoryと同じだけど、 1 リクエストで最初の呼び出しの時だけインスタンス化
![Page 9: Catalyst::Model::Adaptor](https://reader038.vdocuments.pub/reader038/viewer/2022100604/55987dd01a28abf57d8b462d/html5/thumbnails/9.jpg)
Net::Twitter を Model 化
![Page 10: Catalyst::Model::Adaptor](https://reader038.vdocuments.pub/reader038/viewer/2022100604/55987dd01a28abf57d8b462d/html5/thumbnails/10.jpg)
他にも
• DBIC を使ったビジネスロジッククラスをModel 化して単体テストを可能に
• TheSchwartz を Model 化してキューの監視ツールを Catalyst で作ってみる
• アイデアはキミしだい!
![Page 11: Catalyst::Model::Adaptor](https://reader038.vdocuments.pub/reader038/viewer/2022100604/55987dd01a28abf57d8b462d/html5/thumbnails/11.jpg)
C::Model::Adaptor を使うと
• 既存クラスを簡単に Modelにできるよ
• context から設定も簡単に渡せるよ
• クラスはアプリケーション起動時にインスタンス化されるよ
• ビジネスモデルを C::Modelから追い出せるよ
• Catalystに依存しない Testができるよ
• Catalystは Dispatcherと Engine だけやってればいいよ(サンフランシスコ在住 男性)
• ちょっと小粋ないいやつです
![Page 12: Catalyst::Model::Adaptor](https://reader038.vdocuments.pub/reader038/viewer/2022100604/55987dd01a28abf57d8b462d/html5/thumbnails/12.jpg)
ご静聴ありがとうございましたm(_ _)m