我正在尝试让 perl 工作流程模块工作 -http://search.cpan.org/~jonasbn/Workflow/ http://search.cpan.org/~jonasbn/Workflow/
我设法弄清楚它如何与工作流程、操作、条件等一起工作,但我无法让它将验证器类应用于操作。
我的验证器中的 _init 方法加载并打印出我放在那里进行测试的行,但验证方法从未被触发。另外,当从操作类转储 $self->get_validators() 时,我得到空列表。
我创建了一个简短的示例,因此请尝试一下,如果您发现问题,请提供帮助。嗯!
链接到代码 -https://github.com/vmcooper/perl_workflow_test 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:
如果你回答“伯明翰”,它应该写
Your answer is being validated!
并再次提出问题。
当您回答“伦敦”时,应该
Correct! Current state of workflow is - finished
edit现在,无论您的答案是什么,它都会写出“正确!工作流程的当前状态已完成”。
工作流程测试.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>
操作.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>
应用程序::操作::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;
应用程序::验证器::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;
编辑:
如果我在创建之后和执行任何操作之前转储工作流对象,我会得到以下信息:
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' );
正如您所看到的,验证器就在这里,一切都已设置完毕,看起来一切正常,但验证器尚未应用。