こんにちはこんにちは! tomyheroです! トミヘロじゃなくて、とぅーまいひーろ って読むんだよ!
今自分の中で流行ってる、CatalystとConfig周りの実装をこっそり晒そうと思うよ。
aim
catalystアプリだけじゃなくて、外からでも使えるように実装したほうがいいとおもうんだよ!
MyApp::Config
Config::Multiをシングルトンで、どこでもつかえるようにするよ。 MyApp::Utils というので、設定ファイルのパスをとってますね!これについては、後で書くよ!
package MyApp::Config;
use strict;
use warnings;
use Config::Multi;
use MyApp::Utils;
use base 'Class::Singleton';
our $FILES ;
sub _new_instance {
my $cm = Config::Multi->new(
{
dir => MyApp::Utils::path_to('conf')->stringify ,
app_name => 'myapp' ,
extension => 'yml'
});
my $config = $cm->load();
$FILES = $cm->files;
return $config;
}
sub files {
return $FILES;
}
1;
MyApp::Utils
アプリケーションのUtilsモジュールだよ。Catalyst::Utilsだと、カタリスト依存しちゃうから、自分で作っちゃった方が良いと思うよ。 path_toとかのコードは、Catalystを参考にパクると良いと思うよ。
package MyApp::Utils;
use warnings;
use strict;
use Path::Class::Dir;
use Path::Class::File;
use FindBin;
sub home {
return $ENV{MYAPP_HOME} || Path::Class::Dir->new( $FindBin::Bin, './../' );
}
sub path_to {
my ( @path ) = @_;
my $path = Path::Class::Dir->new( &home , @path );
warn $path;
if ( -d $path ) { return $path }
else { return Path::Class::File->new( &home, @path ) }
}
1;
MyApp::Plugin::Config
オレオレコンフィグプラグインを作るよ!
ぶっちゃけ、MyApp::Config を $c->config にぶっ込んでるだけだよ。
package MyApp::Plugin::Config;
use strict;
use warnings;
use MyApp::Config;
use NEXT;
our $VERSION ='0.02';
sub setup {
my $c = shift;
my $config = MyApp::Config->instance();
if( $c->debug ) {
my $files = MyApp::Config->files();
for my $file ( @{$files} ) {
$c->log->debug( 'Load Config ' . $file );
}
}
$c->config( $config ) ;
$c->NEXT::setup( @_ );
}
1;
MyApp::Web
カタリストアプリだよ。プラグイン読み込むよ。
package MyApp::Web; use strict; use warnings; use Catalyst::Runtime '5.70'; use Catalyst qw/+MyApp::Plugin::Config/; our $VERSION = '0.01'; __PACKAGE__->setup; 1;
conf/myapp_web.yml
設定ファイルだよ。
--- name: Config Sample
MyApp::Web::Controller::Root
コンフィグデータが、ちゃんととれてるか表示するよ!
package MyApp::Web::Controller::Root;
use strict;
use warnings;
use base 'Catalyst::Controller';
__PACKAGE__->config->{namespace} = '';
sub default : Private {
my ( $self, $c ) = @_;
$c->response->body( $c->config->{name} );
}
sub end : ActionClass('RenderView') {}
1;
たぶんみえてるんじゃないかな!
おわり
以上だよ。
ちなみに、 MyApp::Config はどこからでも呼べるから、ガンガン呼ぶと良いと思うよ。多い日も安心だね!
:wq!



Leave a comment