NAME
Mojolicious::Plugin::Check - Mojolicious plugin for controller level conditions.
DESCRIPTION
This module provide delayed to around_action hook execution for conditions to use with database, models and over controller level checks. You do not have to use add_condition directly for this because: conditions check route/headers not business logic, you can`t save something in stash, etc.
SYNOPSIS
# Add plugin in startup
$self->plugin('Check');
# Good example:
$r->add_condition(integer => sub {...});
$app->add_checker(user => sub {...});
$r->get('/user/:id')->over(
integer => 'id', # good, simple integer check
user => 'id', # good, delay check
)->to('foo#bar');
# Bad example:
$r->add_condition(integer => sub {...});
$r->add_condition(user => sub {...});
$r->get('/user/:id')->over(
integer => 'id', # good, simple integer check
user => 'id', # bad, too early for DB, Model, Controller etc.
)->to('foo#bar');
METHODS
add_checker
Same as add_condition, but delay execution to around_action hook level.
# Simple "true" checker example
$app->add_checker('true' => sub {
my ($route, $c, $captures, $pattern) = @_;
return $captures->{$pattern} ? 1 : 0;
});
# You can use database and save objects in stash to use in controllers
$app->add_checker('user_exists' => sub {
my ($route, $c, $captures, $pattern) = @_;
my $id = $captures->{$pattern};
my $db = $c->pg->db;
$c->stash->{user} = $db->query('...', $id);
return $c->stash->{user} ? 1 : 0;
});
# The user is guaranteed to have or render not_found page.
$r->get('/user/:id')->over(user_exists => 'id')->to(cb => sub{
my ($c) = @_;
my $user = $c->stash('user');
...
});
Return values for sub:
- true
-
Check pass.
- false or empty
-
Check fail. Render "Page not found" automatically.
- undef
-
Check fail. You should render something manually.
# Example "true" for forbidden status: $self->add_checker('true' => sub { my ($route, $c, $captures, $pattern) = @_; unless( $captures->{$pattern} ){ $c->render(text => 'Forbidden', status => 403); return undef; } return 1; });
AUTHORS
Dmitry E. Oboukhov <unera@debian.org>, Roman V. Nikolaev <rshadow@rambler.ru>
COPYRIGHT
Copyright (C) 2017 Dmitry E. Oboukhov <unera@debian.org> Copyright (C) 2017 Roman V. Nikolaev <rshadow@rambler.ru>
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.8.8 or, at your option, any later version of Perl 5 you may have available.