JPA セミナー #1 (Session 2 Catalyst 改)
1. Plugin
プラグインの使用を控える
- 間違った使用方法、実装方法で定義されていることが多い
本当に使わない方向で
Catalyst::Plugin::Authentication はどうなの?
2. デバッギング
perl 5.10's "Unknown Error"
?dump_info=1
テストを書く
- Test::WWW::Mechanize::Catalyst で自動テストが大変書きやすくなる
- Controller のバグ早期発見につながる
3. 設定
config()
package MyApp::Controller::Foo; __PACKAGE__->config( 'foo' => 'bar' );
- どのコンポーネントも設定用の config アクセサが実装されているが、原則初期化終了前にする
- 初期化終了後で変更すると予想困難なバグの発生につながる
- 先行順位を高く設定するには、アプリケーションレベルで設定する
MyApp->config->( 'Controller::Foo' => { 'foo' => 'bar' } );
has 'foo' => ( is => 'rw', isa => 'Str', );
- 以前までの Class::Accessor::Fast 方式であれば以下のように
__PACKAGE__->mk_accessors('foo');
$self を使う
- アクセサを作らないのであれば $self 内でマージされている値を参照することも可能
$self->{'foo'}
これは止めましょう
package Controller::Foo; __PACKAGE__->config('foo' => 'bar'); sub method : Local { my ($self, $c) = @_; $c->config->{'Controller::Foo'}->{'foo'}; }
- 大抵のケースで多分正常に動くが、確実ではない
- この場合は、 $self->{'foo'} で取り出すのが正しい
package Controller::Foo; __PACKAGE__->config('foo' => 'bar'); sub COMPONENT { my ($self, $c, $config) = @_; $config->{'foo'}; # NO! }
- 先ほどの例はなんとなく動くが、こちらは多分動かない
常に $self を使おう
- コンポーネント範囲の設定は $self を利用するのが理想
- アプリケーションレベルの設定は $c->config から呼び出しても良いが、それも本当にアプリケーション全般に渡って必要な設定に限って使用したほうがよい
Config は使い過ぎでちょうど良い
4. コントローラー
より良いコントローラー
- 薄ければ薄いほど良い
- ベースクラスを利用して薄いコントローラーを実装する
ベースクラス
- 多くのコントローラーは機能ごとに大まかに分類することが出来る
- 大半は設定から動作をカスタマイズできるように実装することが可能
- 先ほどの設定の適用方法の延長で、ベースコントローラーから機能を継承しつつ、Model に最大限の機能を委譲することによって、ほとんど空の Controller を実装していくことが可能
5. Chained
基本的な考え方
実際に使用されるケース
- auto アクションは各コンポーネントで1回ずつ実行されるが、Chained の場合、経路で繋げた全てのアクションで実行することが可能
- Chained に切り替えてから一回も auto を使ったことが無い
- 実際の Chained の使い方は github にあるサンプルで
- http://github.com/jshirley/ (catalyst-example-chained)
6. デプロイ方式
External FastCGI
HTTP::Prefork
- C関数にできるだけのことを割り当てているため軽くて安定
- だが今のところ高負荷もしくは認知度があるサイトでの事例は無い
- unix ソケットの裏技は使えない
- ポートを分けることによる分散などでダウンタイムを最低限に抑えることはできる
7. ログ
8. Action('Classes')
Catalyst 5.7 でアクションクラスとして実装されているものは 5.8 では遥かに便利な Role として再実装されている
Catalyst::Controller::ActionRole
- ActionClass の概念を Role と入れ替えることができる
- Role とは、「あるオブジェクトの特徴・動作を表現する」ためのものなので Catalyst の Action を Role で実装するのは自然なこと
sub action : Does('moo')
- Role の概念をまだ理解してなかったり、使ったことがなければとりあえず今は無視
- 気になったら Moose::Role を参照のこと
ActionClass は Action の動作内容を Catalyst 外のメソッドにラップすることができる
使い時
- meta と思われる副アクションが本アクション以外に実行する必要のある時に有効
- 実装例は、アクセスされたページのプロパティを抜き出してスタッシュに保存するなど
- これは Model でも実装できるが、Action の Role を実装すると構文がすっきりしつつ、リクエストディスパッチにカスタムロジックを注入できるようになる
9. local::lib
Vendor Perl = Not Good
Makefile.PL を使う
- 管理をきちんとすれば、依存関係のあるモジュール類のインストールやエンドユーザー環境での動作も簡単に保障できる
- local::lib と一緒に使えばインストールされたパッケージが実際にアプリケーションが使っているパッケージだということも保障できる
- 複数ユーザーのシステムで同じアプリケーションを複数バージョン運用することも可能
アプリケーション権限はユーザー権限で
- 極力 root で実行しない
- 依存関係も root を必要とするべきではない
- External FastCGI を local::lib でデプロイすれば、サーバー設定以外のアプリケーションのデプロイと実行は root 権限が全くなくても行うことが可能
10. 参加
Catalyst に貢献するには
- 簡単
- 大半は技術力が必要というわけではない
- ドキュメントの提供
- テスト
- ブログ、宣伝活動