带验证器的Perl Workflow模块

Ved*_*ran 6 validation perl workflow

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

我设法弄清楚它是如何工作的工作流程,操作,条件和所有但我无法让它将验证器类应用于该操作.

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

我创建了一个简短的示例,所以如果您发现问题,请尝试并提供帮助.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:
Run Code Online (Sandbox Code Playgroud)

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

Your answer is being validated!
Run Code Online (Sandbox Code Playgroud)

然后再问这个问题.

当你回答"伦敦"它应该

Correct! Current state of workflow is - finished
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

workflow.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>
Run Code Online (Sandbox Code Playgroud)

action.xml

<actions>
    <action name="action1" class="App::Action::Action1" >
        <validator name="validator1">
            <arg>$city</arg>
        </validator>
    </action>
</actions>
Run Code Online (Sandbox Code Playgroud)

validator.xml

<validators>
    <validator name="validator1" class="App::Validator::Validator1">
        <param name="answer" value="London" />
    </validator>
</validators>
Run Code Online (Sandbox Code Playgroud)

应用::动作:: 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;
Run Code Online (Sandbox Code Playgroud)

应用::验证:: 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;
Run Code Online (Sandbox Code Playgroud)

编辑:如果我在创建后立即转储工作流对象,并且在执行任何操作之前我得到:

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' );
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,验证器在这里,一切都已设置,看起来没问题,但验证器未应用.

Ved*_*ran 0

看来我们需要等待一段时间,或者我们可以参与一个项目来完成这个功能。

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

如我错了请纠正我。