Mojolicious



2017年 6月 30

Mojolicious::Validator::Validation – Perform validations – metacpan.org

Mojolicious純正のフォームバリデーションを使う上で気を付ける点を書き留めておく。Mojolicious::Plugin::TagHelpersとも相性良いし(当たり前)、活用すべき。

my $validation = $c->validation;
$validation->required('name')->like(qr/hoge/);
$validation->optional('name2', 'trim')->like(qr/hoge2/);

バリデーション

required()又はoptional()から始める

$validation->required('name')又は$validation->optional('name')から始める。メソッドチェーンでもいいし、都度バリデーションメソッドを呼んでも良い。

  • requidedかoptionalを呼んだ時点でバリデーション対象のfieldが切り替わる。
  • 現在バリデーション対象になっているfieldは$validation->topicで取得できる。

filterはrequired()又はoptional()の第2引数以降で指定する

※ Mojolicious v6.41以降

$validation->required( 'name', 'filter1', 'filter2', ... );
$validation->optional( 'name', 'filter1', 'filter2', ... );

DB等へ保存する値は$validation->outputの値を使う

$c->req->paramsの値はリクエスト時の値なのでDB等に値を保存する場合には使用しない。

  • 特にfilterを使う場合は注意が必要。
  • filter適用後の値は$validation->outputに収納されている。
my $hash_ref = $validation->output;
my $value = $hash_ref->{name};

my $scalar = $validation->param('name');
my $array_ref = $validation->every_param('name');

フィルター

フィルインフォーム

タグヘルパーを使うとfill-in formしてくれるけど、値にフィルターを適用する場合は注意が必要。

  • バリデーション実行時に$c->param()でリクエストパラメータの値の書き換えが必要。
    • タグヘルパーの値補完にはreq->paramの値が使われる
バリデーションも同時に行っている場合

バリデーションエラーがあるとvalidation->param()がundefを返すのでバリデーションエラーがない時だけ書き換える…としなくてはならない。

my $validated_email_value = $c->validation->param('email');
$c->param( email => $validated_email_value ) if $validated_email_value;

独自のバリデーションを追加する

$validation->validator->add_check( name => sub {} )

独自のフィルターを追加する

$validation->validator->add_filter( name => sub {} )

Filed under: Mojolicious,perl

Trackback Uri






2016年 12月 7

PerlのWebApplicationFrameworkであるMojoliciousでは様々なフックが用意されているのだけれど、actionの前後だけに実行したい場合は独自にフックポイントを追加しないといけない。

実装方法その1

一番単純な実装方法はaround_actionフックを使うのが良さそう。actionは$lastフラグが真の時に実行されるので前後に独自のフックをエミットする。

sub startup {
    my $self = shift;
    ...

    $self->hook(
        around_action => sub {
            my ( $next, $c, $action, $last ) = @_;
            return $next->() unless $last;

            # before_actionフックを実行
            $c->app->plugins->emit_hook( before_action => $c );

            # Controller::Actionを実行
            $c->$action();

            # after_actionフックを実行
            $c->app->plugins->emit_hook( after_action => $c );
        }
    );
}

このフックを使えば動的ページのみでフックを実行できる。session関連の操作とかに便利。

実装方法その2

上記のコードの場合は全てのactionに適用されてしまうので、フックを実行したくないcontrollerを作りたい場合はMojolicious::Controllerを継承したclassを作る事で実現できる。

# App
sub startup {
    my $self = shift;
    ...

    $self->hook(
        around_action => sub {
            my ( $next, $c, $action, $last ) = @_;
            return $next->() unless $last;

            $c->process($action);
        }
    );
}
# フックを使用するbase class
package MyApp::Controller;
use Mojo::Base 'Mojolicious::Controller';

sub process {
    my ( $c, $action ) = @_;
    $c->before();
    $c->action();
    $c->after();
}

sub before {
    my $c = shift;
    $c->app->plugins->emit_hook( before_action => $c );
}

sub after {
    my $c = shift;
    $c->app->plugins->emit_hook( after_action => $c );
}

1;
# フックを使用しない base class
package MyApp::NoHookController;
use Mojo::Base 'Mojolicious::Controller';

sub process {
    my ( $c, $action ) = @_;
    $c->action();
}

1;
# フックを使うcontroller
package MyApp::Controller::Fizz;
use Mojo::Base 'MyApp::Controller';

...


# フックを使わないcontroller
package MyApp::Controller::Buzz;
use Mojo::Base 'MyApp::NoHookController';

...

before/after_actionフックを使う場合はMyApp::Controllerを継承したcontrollerを作り、使わない場合はMyApp::NoHookControllerを継承したcontrollerにする。


Filed under: Mojolicious,perl

Trackback Uri






2016年 9月 4

  1. language-mojoliciousを導入する。

  2. keymap.csonに以下を追記

'atom-text-editor[data-grammar="text html mojolicious"]:not([mini])':
    'tab': 'emmet:expand-abbreviation-with-tab'

タブで展開させるとlanguage-mojoliciousとカブるので emmetはcmd+shift+eにしてみる。

'atom-text-editor[data-grammar="text html mojolicious"]:not([mini])':
    'cmd-shift-e': 'emmet:expand-abbreviation-with-tab'

Filed under: Mojolicious,プログラミング

Trackback Uri






2016年 8月 16

1. Mojoliciousプラグインの雛形作成

$ mojo generate plugin MyPlugin

カレントディレクトリに Mojolicious-Plugin-MyPlugin というディレクトリ名で雛形作成される。

2. ドキュメントにAuthor情報を追記する。

$ cd ./Mojolicious-Plugin-MyPlugin
$ vi lib/MyPlugin.pm

minillaではPODに書かれているAuthorが使われる。作成された雛形(MyPlugin.pm)のPODにはAuthorの項目がないので追記する。

vi lib/Mojolicious/Plugin/MyPlugin.pm

...

=head1 AUTHOR

Lastname Firstname <name@domain.com>

=head1 SEE ALSO

....

3. Minilizeする

$ minil migrate

minillaで必要なファイルが作成される。

3.5 Makefileを削除

Makefileは必要ないファイルなので削除する。

$ rm -f ./Makefile

※このファイルがあるとCPANにアップロードした時に

no_generated_files
Remove the offending files/directories!

とおこられるみたい。

4. commitする

$ git add -A
$ git commit -m'initial commit'

まずは全てをコミットしておく。開発準備完了。

5. バリバリ開発する

あとはもりもり開発をすすめる


Filed under: Mojolicious,perl

Trackback Uri






2014年 9月 8

MojoliciousでHTTP(S)の振り分けをリバースプロキシのバックエンドでも出来るようにしてみる
が、さいきんのバーションでは変更があったらしくmojoliciousをばーじょんあっぷしたらうごかない。

こちらのGistが参考になる。
「MojoliciousでHTTP(S)の振り分けをリバースプロキシのバックエンドでも出来るようにしてみる」の例(Apache + mod_proxy)

抜粋すると、

proxy_set_header X-Forwarded-HTTPS
ではなく、

proxy_set_header X-Forwarded-Proto $scheme;
がひつよう(になったらしい)

追記リンク:
MojoliciousのリバースプロキシのSSLの検知方法が変わります – サンプルコードによるPerl入門


Filed under: Mojolicious,perl

Trackback Uri