Hatena::Groupcatalyst

LAPISLAZULI HILL#Catalyst このページをアンテナに追加 RSSフィード

2007-10-16

[][]Catalyst::Model::Adapter調査中のメモ2 Catalyst::Model::Adapter調査中のメモ2 - LAPISLAZULI HILL#Catalyst を含むブックマーク はてなブックマーク - Catalyst::Model::Adapter調査中のメモ2 - LAPISLAZULI HILL#Catalyst Catalyst::Model::Adapter調査中のメモ2 - LAPISLAZULI HILL#Catalyst のブックマークコメント

404 Error - Not Foundですでにやり方は出てるので,それを参考にするだけでいいんだけど.まぁ,やってみる


演習

DateTimeカスタムPluginの機能をベースに作成する

1. ひとまずこういうモジュールを作成
package MyApp::BackEnd::DateTime;

use strict;
use warnings;

use DateTime;

our $VERSION = '0.01';

sub now {
    my ($class, $params) = @_;

    unless (exists $params->{time_zone}) {
        $params->{time_zone} = 'Asia/Tokyo';
    }

    return DateTime->now(%$params);
}

1;
2.helperを実行

./script/myapp_create.pl model DateTime Adaptor MyApp::BackEnd::DateTime now

こういうModelが生成されていた

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

__PACKAGE__->config( 
    class       => 'MyApp::BackEnd::DateTime',
    constructor => 'now',
);

1;
3.呼び出す
    my $dt = $c->model('DateTime');
    $c->response->body( $dt );
4.試してみる

何度リロードしてもアプリケーション起動した時の時刻が出ます.すでに知っているので焦らない

5.サイドHelper,今度はFactory

直接修正しないで,Helperを使ってみる.Factorymodel呼び出しごとにインスタンス作成だそうな

./script/myapp_create.pl model DateTimeFactory Factory MyApp::BackEnd::DateTime now

呼び出しはこう変える

    my $dt = $c->model('DateTimeFactory');
    $c->response->body( $dt );

モデルはこうなる

package MyApp::Model::DateTimeFactory;
use strict;
use warnings;
use base 'Catalyst::Model::Factory';

__PACKAGE__->config( 
    class       => 'MyApp::BackEnd::DateTime',
    constructor => 'now',
);

1;

これでok

6.ついでにFactory::PerRequestでHelper

リクエストごとにインスタンスを生成するそうな.nowならこれがいいかも,と思ったけど変数に入れて使い回すだけだからいっしょか

./script/myapp_create.pl model DateTimeFactoryPerRequest Factory::PerRequest MyApp::BackEnd::DateTime now
7.引数ハッシュリファレンスなので困るというのは

そこも404 Error - Not Foundで述べられているので省略

あとは

まだまだ勉強

  • Pluginを作るのか,Adaptorで作るのか→使い分けが分からない,もうPluginはいらないの?
  • AdaptorとFuctory→なんとなく分かった気がするが,実装も見る.デザインパターンとかとも比べてみる
  • C::M::Adaptorの利点をちゃんと理解する・調べる→ロジックの分離などプログラミング面はもちろん,メモリ使用量とかベンチマークとか起動時間とかの差異も欲しい
  • 具体的にロジックを追い出す方法も模索しよう→no titleの考慮した点を理解できるようにやってみる

しかし,これはほんとすっきりして良い感じ.使い回ししやすいし

JaseminJasemin2011/08/03 03:37Way to go on this essay, heepld a ton.

twyufwjkztwyufwjkz2011/08/03 16:33xxIXvX <a href="http://mvitoinpwtqn.com/">mvitoinpwtqn</a>

cqqcaerypjcqqcaerypj2011/08/04 23:32Z5xC2X , [url=http://sznbggakxhsc.com/]sznbggakxhsc[/url], [link=http://cxrtdwmfodgk.com/]cxrtdwmfodgk[/link], http://lunlsrjkzsvw.com/

zbmnnzmmzbmnnzmm2011/08/05 18:37RUfMyw <a href="http://aazawqtfwvou.com/">aazawqtfwvou</a>

トラックバック - http://catalyst.g.hatena.ne.jp/lapis25/20071016

2007-10-10

[][]Catalyst::Model::Adapter調査中のメモ1 Catalyst::Model::Adapter調査中のメモ1 - LAPISLAZULI HILL#Catalyst を含むブックマーク はてなブックマーク - Catalyst::Model::Adapter調査中のメモ1 - LAPISLAZULI HILL#Catalyst Catalyst::Model::Adapter調査中のメモ1 - LAPISLAZULI HILL#Catalyst のブックマークコメント

AdaptorとかFactoryデザインパターンのだろうか.デザインパターン勉強しないとダメ

URL

使い方

SYNOPSISのとおり.

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

__PACKAGE__->config(
    class       => 'MyApp::Backend::SomeClass',
    constructor => 'new',
    args        => 'hoge',
);

1;

Helper

podではcatalyst.plになってるけど,./script/<app_name>_create.plだと思う

ARGUMENTS

./script/myapp_create.pl model <model_name> Adaptor <class> [<constructor>]

自分で作ったクラスならSYNOPSISのようにいままでのModelをMyApp::Backend::*に移動して指定する,あるいはそこに作る.

./script/myapp_create.pl model SomeClass Adaptor MyApp::Backend::SomeClass create

調べ残しとか,わからないこととか,そもそも分かってないこととか

  • classにDateTimeを直接指定してみたんだけど,動かない.ソースを読んでみたので理由も分かる.もう1枚噛まさないと解決しないような気がするし,そっちのほうが使いやすい気がする→やってみる
  • argsで引数が1コしか指定できない.ハッシュリファレンスを渡すクラスなら問題ないけど→まさにDateTimeは引っかかる気が
  • MVCすら正確に理解できていない気がする→とほほ.勉強しる

[][][]Catalyst::Model::Adapterについて調べる Catalyst::Model::Adapterについて調べる - LAPISLAZULI HILL#Catalyst を含むブックマーク はてなブックマーク - Catalyst::Model::Adapterについて調べる - LAPISLAZULI HILL#Catalyst Catalyst::Model::Adapterについて調べる - LAPISLAZULI HILL#Catalyst のブックマークコメント

2007年10月10日 miyagawa catalyst こういうプラグインはもうないほうがいいとおもう。Model::Adapter

Catalyst::Model::Adapterに関してはno titleで,見ていたのだけど利点と用途を理解してなかった

ちゃんと調べること→me

トラックバック - http://catalyst.g.hatena.ne.jp/lapis25/20071010

2006-11-29

[][][]mysql&utf-8での文字化け対策 mysql&utf-8での文字化け対策 - LAPISLAZULI HILL#Catalyst を含むブックマーク はてなブックマーク - mysql&utf-8での文字化け対策 - LAPISLAZULI HILL#Catalyst mysql&utf-8での文字化け対策 - LAPISLAZULI HILL#Catalyst のブックマークコメント

いや,CatalystじゃなくてDBICの話なんだけど

connect_infoのconnect_infoにon_connect_do => ['SET NAMES utf8'],を追加する

package MyApp::Model::MyApp;

use strict;
use base 'Catalyst::Model::DBIC::Schema';

__PACKAGE__->config(
    schema_class => 'MyAppDB',
    connect_info => [
        'dbi:mysql:myapp',
        'myapp',
        'myapp',
        {
            on_connect_do => ['SET NAMES utf8'],
        },
    ],
);

[参考]

DBIx::Class と mysql で utf8 使うとき - klog

D-5 出張版

CLON - 2006/11/21 - DBIx::Class vs mysql vs UTF-8

(追記)

このあたりタイミングよく(?)catalyst-mlで流れてた

WaltherWalther2012/10/31 13:03Finnidg this post has solved my problem

lgyielkxcollgyielkxcol2012/11/03 11:30CHMmpW , [url=http://ibvnjebcehfz.com/]ibvnjebcehfz[/url], [link=http://aofziotmupqa.com/]aofziotmupqa[/link], http://pxmelvclfbaj.com/

トラックバック - http://catalyst.g.hatena.ne.jp/lapis25/20061129

2006-11-09

[][][][]SchemaでCatalystでも34秒くらいでSchemaクラス生成 SchemaでCatalystでも34秒くらいでSchemaクラス生成 - LAPISLAZULI HILL#Catalyst を含むブックマーク はてなブックマーク - SchemaでCatalystでも34秒くらいでSchemaクラス生成 - LAPISLAZULI HILL#Catalyst SchemaでCatalystでも34秒くらいでSchemaクラス生成 - LAPISLAZULI HILL#Catalyst のブックマークコメント

Catalyst::Helper::Model::DBIC::Schema - search.cpan.org

DBIx::Class::Schema::Loader で 34 秒くらいで Schema クラス生成 - IT戦記という記事があったけどそれのCatalystのHelper版.なかでは同様にDBIx::Class::Schema::Loaderを使ってる

% ./script/myapp_create.pl model DBIC DBIC::Schema myapp::Schema create=static dbi:mysql:myapp root

create=static dbi:mysql:sandobox root
 exists "/Users/lapis/src/myapp/script/../lib/myapp/Model"
 exists "/Users/lapis/src/myapp/script/../t"
Dumping manual schema for myapp::Schema to directory /Users/lapis/src/myapp/script/../lib ...
Schema dump completed.
created "/Users/lapis/src/myapp/script/../lib/myapp/Model/DBIC.pm"
created "/Users/lapis/src/myapp/script/../t/model_DBIC.t"

lib/myapp/Model/DBIC.pm,t/model_DBIC.tとlib/myapp/Schema.pmに加えてlib/myapp/Schemaフォルダ内にSchemaファイルを自動生成してくれる

create=を指定するときは(もちろん)DBIx::Class::Schema::Loaderが必要.

またconnect_info argumentsを指定してやらないとエラーになる(Schema生成するんだから当然か).あとは実際の構成に合わせて修正してやればよい.Model/DBIC.pmのなかにサーバの設定が書き込まれるので必要に応じてmyApp.ymlに書き出すとかも

このコマンドを実行するだけでserver起動して下記のようにclassにアクセスできるようになる

[debug] Loaded components:
.-----------------------------------------------------------------+----------.
| Class                                                           | Type     |
+-----------------------------------------------------------------+----------+
| myapp::Controller::Root                                         | instance |
| myapp::Model::DBIC                                              | instance |
| myapp::Model::DBIC::Blog                                        | class    |
| myapp::Model::DBIC::BlogComment                                 | class    |
| myapp::Model::DBIC::Roles                                       | class    |
| myapp::Model::DBIC::UserRoles                                   | class    |
| myapp::Model::DBIC::Users                                       | class    |
'-----------------------------------------------------------------+----------'

ちなみにcreate=dynamicを指定すると,DBIx::Class::Schema::LoaderでSchemaが生成される.myApp::Schemaをあらかじめ生成する必要もない.最初はDBIx::Class::Schema::Loaderで作っておいて,あとで作り直せばよい.あとで作成するときはmyApp::Schemaが上書きされなかったので,消してからhelperを実行した

[参考]

The CPAN Search Site - search.cpan.org

2006/06/21 - memo - unknownplace.org

トラックバック - http://catalyst.g.hatena.ne.jp/lapis25/20061109

2006-10-25

[][]Catalyst::Model::DBIC::Schemaとtt Catalyst::Model::DBIC::Schemaとtt - LAPISLAZULI HILL#Catalyst を含むブックマーク はてなブックマーク - Catalyst::Model::DBIC::Schemaとtt - LAPISLAZULI HILL#Catalyst Catalyst::Model::DBIC::Schemaとtt - LAPISLAZULI HILL#Catalyst のブックマークコメント

まるごとPerlのCatalystの記事だと

$c->stash->{data} = [ $c->model('DBIC::Hoge')->search({}, { page => 1, rows => 10}) ];

として配列に変換してFOREACHでまわしていた

[% FOREACH d = data %]
  [% d.id %] - [% d.url %]<br />
[% END %]

pagerを利用するときに取得したデータをそのまま渡したかったんだけど

$c->stash->{data} = $c->model('DBIC::Hoge')->search({}, { page => 1, rows => 10});

その場合

[% WHILE (d = data.next) %]
  [% d.id %] - [% d.url %]<br />
[% END %]

WHILEでnextを使ってまわすとうまくいった

[]DBIx::Class::ResultSetでのpaging DBIx::Class::ResultSetでのpaging - LAPISLAZULI HILL#Catalyst を含むブックマーク はてなブックマーク - DBIx::Class::ResultSetでのpaging - LAPISLAZULI HILL#Catalyst DBIx::Class::ResultSetでのpaging - LAPISLAZULI HILL#Catalyst のブックマークコメント

my $schema = Hoge::Schema->connect(~);
my $rs = $schema->resultset('hoge')->search({}, { page => 1, rows => 10});

print "         First page: ", $rs->pager->first_page, "\n";
print "          Last page: ", $rs->pager->last_page, "\n";
print "First entry on page: ", $rs->pager->first, "\n";
print " Last entry on page: ", $rs->pager->last, "\n";

Catalyst::Model::DBIC::Schemaだと

$c->stash->{data} = $c->model('DBIC::Hoge')->search({}, { page => 1, rows => 10});

としておいて,TTで

<ul>
<li>         First page: [% data.pager.first_page %]</li>
<li>          Last page: [% data.pager.last_page %]</li>
<li>First entry on page: [% data.pager.first %]</li>
<li> Last entry on page: [% data.pager.last %]</li>
</ul>

とかすればできた.

ちなみにClass::DBI::Sweetではこんな感じ

my ($page, $data) =  CDBI::hoge->page(
    {}, { rows => 10, page => 1 }
)

print "         First page: ", $page->first_page, "\n";
print "          Last page: ", $page->last_page, "\n";
print "First entry on page: ", $page->first, "\n";
print " Last entry on page: ", $page->last, "\n";
トラックバック - http://catalyst.g.hatena.ne.jp/lapis25/20061025