Schema::Loader with Catalyst
Catalyst::Model::DBIC::Schema を使う。
この Model は大きく3つの使いかたがある。
- 単純に既に存在する Schema クラスを使用する
- Schema::Loader で既存の DB から Schema クラスを生成し、それを使用する
- Schema::Loader で既存の DB から Schema::Loader クラスを生成し、それを利用する。
1 はまず Schema クラスをどこかに作ってあり(My::Schemaと仮定する)、それをそのまま Catalyst::Model として利用する。
./script/myapp_create.pl model DBIC DBIC::Schema My::Schema
で、MyApp::Model::DBIC が作成される。この My::Schema に connection なんかが定義されていてそれを使う場合はこのままでOK。
別の接続先を使う場合なんかは MyApp::Model::DBIC の設定で connect_info を書いておけばそっちが使われる。ヘルパーの最後に
./script/myapp_create.pl model DBIC DBIC::Schema My::Schema dbi:SQLite:/path/to/foo.db
とかしてもOK。
で、これでアプリ内から Schema クラスを使える。で、この場合で My::Schema::Table を使うには $c->model('DBIC::Table')->search
とかとする。ここがわかりにくいのかもしれない。
2 は 1 と同じだが、ヘルパーを叩くときに既存DBを元にSchemaクラスを生成する。
./script/myapp_create.pl model DBIC DBIC::Schema My::Schema create=static dbi:SQLite:myapp.db
こんな感じで、ヘルパーを叩いたときに、myapp.db のテーブル定義をもとに My::Schema(::*) クラスが自動生成される。後の使いかたは同じ。
3 は Schema クラスではなく、Schema::Loader クラスを生成し、Catalystアプリが起動するたびにDBのテーブル定義を見て動的にSchemaクラスを生成する。Catalyst::Model::CDBI みたいな感じ。
これを使うには
./script/myapp_create.pl model DBIC DBIC::Schema My::Schema create=dynamic dbi:SQLite:myapp.db
で、My::Schema という Schema::Loader クラスが生成され、それが使われる。
Catalystアプリからの使いかたはすべて1と同じ。
My::Schema::* をよぶのに、$c->model('DBIC::*')
を呼ぶというのがわかりずらいのかも。
あと、Schema::Loader を使う場合、テーブル定義以外の、リレーションの設定とかインフレーションとかの設定を書くために、My::Schema::Table を書くかもしれないが、CDBI::Loader と違いそれらはデフォルトでは読み込まれないから注意が必要。
それらをロードするためには、My::Schema に __PACKAGE__->load_classes;
を付け加える必要がある。
たしかになんかわかりにくいかも。かなぁ。
- Schema based な DBIC の使いかたの例: DBIx::Class::Manual::Example
- C::M::Schema::Loader: Catalyst::Model::Schema::Loader
- とそのヘルパー: Catalyst::Helper::Model::Schema::Loader
とかの pod を見るといいかも。
on_connect_do
で、下記の PRAGMA synchronous = off
だとか、MySQL の SET NAMES utf8
みたいなのを DBIC でやるばあいは
$schema->storage->on_connect_do( ['SET NAMES utf8'] );
みたいにするわけだけど、これは今はschemaクラス自体には書いておけないのでめんどくさい。(0.699..のほうではできるようになっている)
Catalyst でつかうだけなら、今の DBIC でも、Model::DBIC::Schema の connect_info
で on_connect_do
を書いておける。
connect_info => [
'dbi:SQLite:dbname=foo.db',
{ on_connect_do => [ 'PRAGMA synchronous = OFF', ], }
],
blblack++
Text::Trac
mizzy.org - Text::Trac - Trac Wiki 記法パーサ
IRC の #catlxom での会話の流れで、自分が Text::Trac をつくることになりました。といってもまだつくりかけなので、CPAN にアップするのはまだ先になりそう。
先になりそうとかいってますが、このペースでいけばこの週末中にはあがっちゃいそうです。
あー、catlxomどしようなぁ。
Imager::Filter::RoundedCorner 0.02
- アンチエイリアスサポート
- ボーダーサポート
した。
併用はしない方が良いw ボーダーは wired.com にあるような感じの画像作成用。
しかしひどい実装だ。アンチエイリアスはコーナーにblurかけてるだけだし、ボーダーはなんかごちゃごちゃ力技処理。
パッチ歓迎!
はての君がなんかいってたからWebインタフェつくっか。
角丸フィルタ for Imager
仕事用に作ったの、ちょっと整備してリリース。
use Imager;
use Imager::Filter::RoundedCorner;
my $image = Imager->new;
$image->read( file => 'source.jpg' );
$image->filter(
type => 'rounded_corner',
radius => 10,
bg => '#ffffff'
);
$image->write( file => 'dest.jpg' );
とかって使う。
Imager 良いねー。夜時間があったら border のサポートもする。
Plugin::Flavour
URLの最初のパスをflavourに使うっていうやつを別モジュールにきりわけようかとおもうんだけど、だめかなぁ。
誰か使ってたりすんのかなぁ。
$c が必要な場合 prepare ハンドラは使うべきではない
代りに prepare_*
を使え。
そもそも NEXT のチェーンで
sub prepare {
my $class = shift;
my $c = $class->NEXT::prepare(@_);
...
}
とか、NEXT 呼んだ後に処理を書くべきじゃないと思う。こうすると実行される順番があべこべになってしまう。
こうする必要があるのは prepare は $c
ではなくクラス名を渡されるようになっているため。
prepare_*
は $c がわたされる。
SYNOPSIS of Plugin::FormValidator::Simple::Auto
use Catalyst qw/ FormValidator::Simple FormValidator::Simple::Auto /;
__PACKAGE__->config(
validator => {
messages => 'messages.yml',
profiles => 'profiles.yml',
# and other FormValidator::Simple config
},
);
# profiles.yml
action1:
param1:
- NOT_BLANK
- ASCII
- [ 'LENGTH', 4, 10 ]
param2:
- NOT_BLANK
# then your action
sub action1 : Global {
my ($self, $c) = @_;
# $c->form($profile) already executed!
unless ($c->form->has_error) {
...
}
}
とか言うのを作ろうかと。
牧さんのパクリ。