带有验证器的 Perl 工作流模块 [英] Perl Workflow module with validator
问题描述
我正在尝试使用 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屋!