带有验证器的 Perl 工作流模块 [英] Perl Workflow module with validator

查看:38
本文介绍了带有验证器的 Perl 工作流模块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 perl 工作流模块 - http://search.cpan.org/~jonasbn/Workflow/

i'm trying to get things work with perl Workflow module - http://search.cpan.org/~jonasbn/Workflow/

我设法弄清楚它如何处理工作流、操作、条件以及所有但我无法将验证器类应用于操作.

I managed to figure out how it works with workflows, actions, conditions and all but i can't get it to apply validator class to the action.

来自验证器的我的 _init 方法加载并打印出我放在那里进行测试的行,但验证方法从未被触发.此外,当从操作类转储 $self->get_validators() 时,我得到空列表.

My _init method from validator loads and prints out the line that i put there for testing but validate method is not triggered ever. Also, when dumping $self->get_validators() from action class i get empty list.

我创建了一个简短的示例,如果您发现问题,请尝试并提供帮助.Tnx!

I created a short example so please try it and help out if you see the problem. Tnx!

代码链接 - https://github.com/vmcooper/perl_workflow_test

运行程序

程序开始于

Answer: London
If you answer right the action should change state to 'finished'. Try answering wrong first.
Capital city of England:

如果你回答伯明翰",它应该写

if you answer "Birmingham" it should write

Your answer is being validated!

然后再问这个问题.

当你回答伦敦"时,它应该

When you answer "London" it should

Correct! Current state of workflow is - finished

编辑现在无论您的答案是什么,它都会写出正确!当前工作流程状态 - 完成".

edit Now it writes out "Correct! Current state of workflow is - finished" whatever your answer is.

workflow_test.pl

workflow_test.pl

use strict;
use Log::Log4perl     qw( get_logger );
use Workflow::Factory qw( FACTORY );

Log::Log4perl::init( 'log4perl.conf' );
system('clear');

# Stock the factory with the configurations; we can add more later if we want
FACTORY->add_config_from_file(
    workflow   => 'workflow.xml',
    action     => 'action.xml',
    persister  => 'persister.xml',
    validator  => 'validator.xml'
    );

my $workflow = FACTORY->create_workflow( "Workflow1" );
my $context = $workflow->context;

while ( $workflow->state eq "INITIAL" ) {
    print "If you answer right the action should change state to 'finished'. Try answering wrong first.\n";
    my $city = get_response( "Capital city of England: " );
    print "You answered - $city\n";
    $workflow->execute_action( 'action1' );

    if( $workflow->state eq "INITIAL" ) {
        print "Your answer is wrong! try again!\n\n";
    }
}

print "\nCorrect! Current state of workflow is - ".$workflow->state."\n\n";


# Generic routine to read a response from the command-line (defaults,
# etc.) Note that return value has whitespace at the end/beginning of
# the routine trimmed.

sub get_response {
    my ( $msg ) = @_;
    print $msg;
    my $response = <STDIN>;
    chomp $response;
    $response =~ s/^\s+//;
    $response =~ s/\s+$//;
    return $response;
}

工作流.xml

<workflow>
     <type>Workflow1</type>
     <time_zone>local</time_zone>
     <description>This is my workflow.</description>
     <persister>Persister1</persister>

     <state name="INITIAL">
        <action name="action1" resulting_state="finished"/>
     </state>

    <state name="finished" />
 </workflow>

action.xml

<actions>
    <action name="action1" class="App::Action::Action1" >
        <validator name="validator1">
            <arg>$city</arg>
        </validator>
    </action>
</actions>

验证器.xml

<validators>
    <validator name="validator1" class="App::Validator::Validator1">
        <param name="answer" value="London" />
    </validator>
</validators>

App::Action::Action1.pm

App::Action::Action1.pm

package App::Action::Action1;

use strict;
use base qw( Workflow::Action );
use Workflow::Exception qw( validation_error configuration_error );
use Data::Dumper;

sub new {
    my $class = shift;

    my $self = {};
    bless ($self, $class);

    return $self;
}

sub execute {
    my $self = shift;
    my $wf = shift;
    print "App::Action::Action1::Execute\n";
    print "Validators: ".Dumper($self->get_validators())."\n";
}

1;

App::Validator::Validator1.pm

App::Validator::Validator1.pm

package App::Validator::Validator1;

use strict;
use base qw( Workflow::Validator );
use Workflow::Exception qw( validation_error configuration_error );
use Data::Dumper;
use Carp qw(carp);

sub _init {
    my ( $self, $params ) = @_;
     unless ( $params->{answer} ) {
         configuration_error
             "You must define a value for 'answer' in ",
             "declaration of validator ", $self->name;
     }
     if ( ref $params->{answer} ) {
         configuration_error
             "The value for 'answer' must be a simple scalar in ",
             "declaration of validator ", $self->name;
     }
     print "Answer: ".$params->{answer}."\n";
     $self->{ answer => $params->{answer} };
}

sub validate {
    my ( $self, $wf, $city ) = @_;

    print "Your answer is being validated!\n";
    print "Your answer is - ".$city."\n";

    my $check;

    if ( $city eq $self->{answer} ){
        $check = 1;
    } else {
        $check = 0;
    }
    unless ( $check ) {
        validation_error "Validation error!";
    }
}

1;

如果我在创建之后和执行任何操作之前立即转储工作流对象,我会得到这个:

If i dump workflow object right after creation and before any action is executed i get this:

Workflow: $VAR1 = bless( {
    '_states' => {
        'INITIAL' => bless( {
            ...,
            '_actions' => {
                'action1' => {
                    'resulting_state' => 'finished',
                    'name' => 'action1'
                }
            },
            '_factory' => bless( {
                ...,
                '_action_config' => {
                    'default' => {
                        'action1' => {
                            'name' => 'action1',
                            'class' => 'App::Action::Action1',
                            'validator' => [
                                {
                                    'arg' => [
                                         '$city'
                                       ],
                                    'name' => 'validator1'
                                }
                            ]
                        }
                    }
                },
                '_validators' => {
                    'validator1' => bless( {
                        'name' => 'validator1',
                        'class' => 'App::Validator::Validator1',
                        'PARAMS' => {}
                    }, 'App::Validator::Validator1' )
                },
                '_validator_config' => {
                    'validator1' => {
                        'answer' => 'London',
                        'name' => 'validator1',
                        'class' => 'App::Validator::Validator1'
                    }
                },
                ...
            }, 'Workflow::Factory' ),
            'type' => 'Workflow1',
            'PARAMS' => {}
        }, 'Workflow::State' ),
        'finished' => $VAR1->{'_states'}{'INITIAL'}{'_factory'}{'_workflow_state'}{'Workflow1'}[1]
    },
    ...
}, 'Workflow' );

如您所见,验证器已完成,一切都已设置完毕,看起来一切正常,但未应用验证器.

As you can see, validator is here and everything is set up and looks like it's ok but the validator is not applied.

推荐答案

看来我们需要稍等片刻,或者我们可以参与一个项目来完成此功能.

Looks like we will have to wait for this a bit or we can participate in a project to get this functionaity done.

滚动到get_validators"标题,您将看到一个#TODO"标记.我不确定这是否意味着需要完成文档或代码,但我确实查看了一些代码,看起来此功能需要完成代码.http://search.cpan.org/~jonasbn/Workflow-1.41/lib/Workflow/Factory.pm

Scroll to the "get_validators" heading and you will se a "#TODO" mark. I'm not sure whether this means the documentation needs to be done or code but i did look at the code a bit and it looks like the code needs to be done for this functionality. http://search.cpan.org/~jonasbn/Workflow-1.41/lib/Workflow/Factory.pm

如果我错了,请纠正我.

Correct me if i'm wrong.

这篇关于带有验证器的 Perl 工作流模块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆