動作確認できる環境を作る
とりあえず動作を確認できる環境を作る。
アプリディレクトリにPluginディレクトリを追加。
$ mkdir -p lib/Mojolicious/Plugin
libにパスが通っていれば、
app->pluginで普通に読み込まれるようになる。
プラグインのプログラムを書く
プラグインのプログラムは、以下の形式に従うようにする。
モジュールの名前を"Mojolicious::Plugin::*"にする
Mojolicious::Pluginを継承する
registerメソッドを定義する
以下の様なプログラムになる。
lib/Mojolicious/Plugin/Example.pm
package Mojolicious::Plugin::Example;
use Mojo::Base 'Mojolicious::Plugin';
sub register {
my ($self, $app, $conf) = @_;
}
1;
registerメソッドに処理を書いていく。
helper機能でControllerに新しいメソッドを追加したり、
フック機能で入力や出力のフィルタ処理を追加したりする感じになる。
例: Controllerに新しいメソッドを追加する
helper機能を使うと、Controllerに新しいメソッドを追加することができる。
例えば、PHPのnl2brのようなメソッドを追加するプラグインは以下のようになる。
lib/Mojolicious/Plugin/Nl2br.pm
package Mojolicious::Plugin::Nl2br;
use Mojo::Base 'Mojolicious::Plugin';
sub register {
my ($self, $app, $conf) = @_;
$app->helper('nl2br' => sub {
my ($c, $text) = @_;
$text =~ s/(¥r¥n|¥n¥r|¥n|¥r)/
$1/g;
return $text;
});
}
1;
これを読み込むと、Controllerにnl2brメソッドが生える。
テンプレート内では、appでControllerにアクセスできるようになっているので、
app->nl2br($txt)という感じで使用することができるようになる。
myapp.pl
use Mojolicious::Lite;
use lib 'lib';
plugin 'Nl2br';
get '/' => sub {
my $self = shift;
$self->stash->{txt} = "テスト1¥nテスト2¥nテスト3¥n";
# ここでも使える $self->nl2br("テスト1¥nテスト2¥nテスト3¥n");
$self->render();
} => 'index';
app->start;
__DATA__
@@ index.html.ep
テスト
<%== app->nl2br($txt) %>
その他
プラグインを読み込む名前空間を追加
自社やアプリ特有のプラグインを作る場合は、
名前空間を"Mojolicious::Plugin"以外にしたいことがあるかもしれない。
以下の設定で、プラグインを読み込む名前空間を追加することができる。
myapp.pl
push @{app->plugins->namespaces}, 'MyApp::Plugin';
お手本プラグイン
標準で入っているプラグインのプログラムを読めば、
どのような機能が作れるか、どのように実装するのかが分かる。
https://metacpan.org/pod/Mojolicious::Plugins#PLUGINS
CPANでMojolicious::Pluginを検索すれば、
他の人が作ったプラグインも見れる。
https://metacpan.org/search?q=Mojolicious%3A%3APlugin