On Jun 19, 2012, at 9:42 PM, Solli Honorio wrote:
> Wallace, 
> 
> Eu não consegui entender este Data::Manger. Não entendi como utilizar este 
> cara verificar os inputs, ao invés de ficar fazer 'if'. O cara parece ser 
> interessante, mas eu fiquei boiando.

Solli,

O Data::Verifier[1] é o coração desta história; é onde realmente acontece a 
validação dos dados. O Data::Manager foi escrito como a união entre o D::V[1] e 
o Message::Stack[2], através do Message::Stack::Parser::DataVerifier[3] ele 
processa um objeto do tipo D::V::Results[1] para facilitar a construção de 
mensagens de erro ou qualquer outro processamento necessário após validação dos 
dados. O D::V[1] lhe permite validar os inputs com o suporte do sistema de 
tipos do Moose - você pode até extender estes para criar tipos mais especificos 
para o seus dados, e ainda ele provê funcionalidades a mais de: filtros, 
coerção de valores, pos-checkagem, etc, como exemplo no caso em que você 
precise verificar campos de senha onde você fornece ao seu usuário dois campos 
e precisa confirmar que ambos tem os mesmos valores:

profile => {
    password => {
        required => 1,
        type => StrongPassword, # aqui você define este tipo a partir do 
fornecido pelo Moose: Str
        dependent => {
            password2 => {
                required => 1,
            }
        },
        post_check => sub {
            my $r = shift;
            return $r->get_value('password') eq $r->get_value('password2');
        }
    }
}

No email anterior, também citei a "role" CX::Controller::Verifier[4] que foi 
escrita para facilitar a validação de dados através da stack do Data::Manager 
dentro do Catalyst em que você declara o "profile" dos seus parâmetros de 
entrada ($c->request->parameters, em algumas aplicações eu sobrecarreguei o 
método "verify" desta "role" para validar os dados de $c->request->data em 
controllers do tipo Catalyst::Controller::REST[5]) dentro da configuração do 
Controller para cada action em que você receba dados.

> 2012/6/8 Wallace Reis <[email protected]>
> __PACKAGE__->config(
>  verifiers => {
>    my_action => {
>      profile => {
>        image_file => {
>          required => 1,
>          type => 'FileHandle',
>          post_check => sub { isa_image_file(shift->get_value('image_file')) }
>        },
>      },
>    },
>  },
> );
> 
> sub my_action :Local {
>  my($self, $c) = @_;
>  my $results = $self->verify($c);
>  $c->model('MyBizClass')
>    ->handle($results->get_value('image_file'), $c->model('DB')->dbh, 
> $c->user->email);
> }

Dae então - a depender de como você configurou o seu controller - no momento em 
que ->verify($c) acontece e a validação falha, você pode pedir que seja feito 
um ->detach para uma determinada action que realizará a construção da sua 
resposta de erro ao usuário (detach_on_failure), deste modo, se o processamento 
chegar a ->model('MyBizClass')...sabe-se que os dados estão corretos e pode-se 
seguir com o processamento normal da requisição.

Se precisar de mais info, gritae!

Ab,

[1] https://metacpan.org/module/Data::Verifier
[2] https://metacpan.org/module/Message::Stack
[3] https://metacpan.org/module/Message::Stack::Parser::DataVerifier
[4] https://metacpan.org/module/CatalystX::Controller::Verifier
[5] https://metacpan.org/module/Catalyst::Controller::REST

--
Wallace Reis | wreis
[email protected]
http://www.about.me/wallacereis

=begin disclaimer
   Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
 SaoPaulo-pm mailing list: [email protected]
 L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
=end disclaimer

Responder a