[SP-pm] Data::Manager, alguém utiliza este troço ?!
Lucas Oliveira
lucasmateus.oliveira at gmail.com
Thu Sep 5 11:41:10 PDT 2013
Solli e a quem interessar, fiz um cadastro e login completo para exemplificar o uso do Data::Manager + I18N que quiser dar uma olhada ta ai.
https://github.com/luma777/catalyst-data-manager-i18n
Não fiz o README ainda mas os agradecimentos vai para o Eden que me ensinou boa parte do que está ai :D
Em 04/09/2013, às 01:15, Hernan Lopes <hernanlopes em gmail.com> escreveu:
> Eu prefiro deixar minhas validacoes juntos com as definicoes dos atributos dos meus objetos, pois provavelmente eu vou validar um objeto antes de fazer algo com ele.
> Então eu faco o seguinte (o exemplo abaixo é para exemplificar atraves da analise do mesmo, ele não irá compilar):
>
> Em resumo:
> 1. defino os campos dentro de um hash, juntos com as validacoes
> 2. faco um loop para adicionar (com moose) cada campo na classe
> 3. defino um metodo salvar e esse metodo salvar vai verificar se o atributo tem alguma validacao que deve ser executada
>
> Entao eu termino com algo assim:
>
> package My::Class;
> use Moose;
>
> #meta definicao dos meus atributos.. fica dentro de um hash... os atributos ainda nao foram declarados
> #nelas residem as validacoes, coerce, sql etc tudo que é simples e relacionado a esse campo
> #consigo incluir por exemplo um array com items para eu validar antes de salvar, etc
> #ex
> my $attrs = {
> 'preco' => {
> # isa => 'Int', #opcional
> req => 1,
> validation_regex => '(\d+)', # vou usar isso antes do metodo save
> coerce => sub { # Vai executar tambem isso antes do save
> my ( $self, $value ) = @_;
> $value =~ s|^ +| +\$|g;
> $value =~ s|(.+)(,\|\.)00\$|$1|gi;
> $value =~ s|\D||gi;
> return $value;
> },
> sql =>
> {
> "type" => "integer",
> "null_value" => 0
> },
> validacao_extra => [
> {
> rotulo => 'Verifica se contem numeros na mensagem',
> validacao => sub {
> my ( $campo ) = @_;
> return 1 if "valido" eq "valido";
> return 0;
> },
> msg_erro => "Tem erro nesse campo"
> }
> ,
> .... e depois adicionar o "validacao_extra" la ao final no before_save
> ... e pronto...
>
> ]
> },
> 'url' => {
> req => 1,
> validation_regex => '^http',
> sql => {
> type => 'string',
> "index" => 'not_analyzed',
> }
> },
>
> 'idade' => {
> req => 1,
> validation_regex => '(\d+)',
> sql => {
> "type" => "integer",
> "null_value" => 0
> },
> },
> };
>
> # declara cada atributo para esta classe
> foreach my $attr ( keys $attrs ) {
> #Mete o has dentro do foreach pra declarar cada chave dos meus $attrs
> has $attr => (
> is => 'rw', #podia vir do meu config la de cima ne...
> ( exists $attrs->{$attr}->{default} )
> ? (
> default => $attrs->{$attr}->{default}
> )
> : (),
> );
> }
>
> #coerce nos valores, é usado antes do metodo save... mas pode muito bem usar o coerce do moo(u|se)
> sub coerce {
> my ($self) = @_;
> foreach my $attr ( keys %$attrs ) {
> if ( exists $attrs->{$attr}->{coerce} && defined $self->$attr ) {
> $self->$attr(
> $attrs->{$attr}->{coerce}->( $self, $self->$attr ) );
> }
> }
> }
>
> #valida antes de salvar
> #pode por exemplo verificar se foi setado e executar o $attrs->{ $attr }->{ validation_regex }, etc
> sub validate {
> my ($self) = @_;
> foreach my $attr ( keys $attrs ) {
> return 0
> if exists $attrs->{$attr}->{req}
> and $attrs->{$attr}->{req} == 1
> and !defined $self->$attr;
> if ( exists $attrs->{ $attr }->{ validation_regex } ) {
> //valida a bagaca
> //pode ler de $self, ou receber o valor como parametro da sub validate, etc
> }
> }
> return 1;
> }
>
> #before save...
> before 'save' => sub {
> my ($self) = @_;
> $self->coerce();
> };
>
> #save somente se validate
> sub save {
> my ($self) = @_;
> next unless $self->validate();
> }
>
>
>
> abs,
>
> Hernan
>
>
>
>
>
>
>
>
>
>
> 2013/9/3 Blabos de Blebe <blabos em gmail.com>
> Na verdade foi até coincidência o Solli tocar no assunto, pq assim como mapas, eu ia perguntar isso pra vcs em breve.
>
>
> 2013/9/3 Blabos de Blebe <blabos em gmail.com>
> > Blabos, e se você tiver 2 formulários na mesma página, por exemplo, um de login e um de cadastro ? Vai ter que melhorar na gambi né ? heheheheheh
>
> Correto.
>
> > Se mudar o nome do campo entao… chora hehehe
>
> Correto denovo.
>
> > Marcar o campo errado em vermelho vai precisar de mais gambi :D
>
> Mais ou menos. Eu uso uma alternativa, no exemplo. Mas sim, é melhor marcar o campo com vermelho.
>
> > Tem muitas vantagens usar o Data::Manager
>
> Correto denovo.
>
> O porém é que o meu exemplo é exatamente específico. Um form, quatro campos.
>
> Não to dizendo que nao vou usar o Data::Manager, ou alguma solução parecida. Só nao vou usar nessa semana :)
>
> As soluções apresentadas são apenas o mais pá-pow que dá pra fazer com *a* hard-restriction desse sprint: tempo; e uma soft-restriction: Data::Manager é novo pra mim.
>
> Depois eu refatoro. Tá previsto isso.
>
> Tá pronto x Tá bom.
>
> No meu caso nesse momento, tá pronto é mandatório. Quem me conhece sabe o quanto eu gosto de gambiarra e o quanto tá custando esse tá pronto.
>
> :)
>
> []'s
>
>
>
>
>
> 2013/9/3 Lucas Oliveira <lucasmateus.oliveira em gmail.com>
>
> Blabos, e se você tiver 2 formulários na mesma página, por exemplo, um de login e um de cadastro ? Vai ter que melhorar na gambi né ? heheheheheh
>
> Se mudar o nome do campo entao… chora hehehe
>
> Se precisar fazer um "pirulito" para importar para a base a validação não é aproveitável… esqueçe
>
> Marcar o campo errado em vermelho vai precisar de mais gambi :D
>
> Tem muitas vantagens usar o Data::Manager
>
>
> Em 03/09/2013, às 18:30, Blabos de Blebe <blabos em gmail.com> escreveu:
>
>> Opa,
>>
>> O meu caso é muito simples (pequeno) e o meu tempo é curto. O que foi mais rápido pra mim foi essa tosqueria aqui:
>>
>> No controller:
>>
>> ...
>> my $errors = [];
>>
>> ## not null
>> foreach my $field ( keys %{$fields} ) {
>> push @{$errors}, 'empty_' . $field
>> unless $fields->{$field};
>> }
>>
>> ## unique
>> foreach my $field (qw{ username email }) {
>> push @{$errors}, 'already_' . $field
>> if $rs_user->find( { $field => $fields->{$field} } );
>> }
>>
>> ## invalid email
>> push @{$errors}, 'invalid_email'
>> unless Email::Valid->address( $fields->{email} );
>>
>> if ( @{$errors} > 0 ) {
>> $c->stash->{user} = $fields;
>> $c->stash->{errors} = $errors;
>> return;
>> }
>> ...
>>
>> No template:
>>
>> [% IF errors.size > 0 %]
>> <div data-alert class="alert-box alert">
>> [% FOREACH error IN errors %]
>> [% msg_block = 'msg_' _ error %]
>> [% PROCESS $msg_block %]<br>
>> [% END %]
>> <a href="#" class="close">×</a>
>> </div>
>> [% END %]
>> ...
>>
>> [% BLOCK msg_empty_full_name %]
>> Você precisa preencher o seu nome completo.
>> [% END %]
>>
>> [% BLOCK msg_empty_username %]
>> Você precisa preencher o seu username.
>> [% END %]
>> ...
>>
>>
>>
>> Deve ter formas mais inteligentes de fazer isso, mas no momento, a mais inteligente pra mim, é a que eu consigo fazer mais rápido. Esse é meu "único" form.
>>
>> []'s
>>
>>
>> 2013/9/3 Solli Honorio <shonorio em gmail.com>
>> Blabos, o que você está imaginando para validar ? Estilo old-school com um encadeamento de if ? Dispatch table ? NDA ?
>>
>> Abraços,
>>
>> Solli Honorio
>>
>>
>> Em 3 de setembro de 2013 16:35, Blabos de Blebe <blabos em gmail.com> escreveu:
>>
>> Em alguns casos, complexidade é um pouco ponto de vista.
>>
>> Acho que entendi a abordagem do mantovani, mas pro meu caso específico, acho que é também o overhead, já que eu só valido 4 campos em uma situação eventual. Estou cogitando nem usar o Data::Manager.
>>
>> Se fosse um cazilhao de campos sendo validados constantemente, acho que valeira a pena.
>>
>> Mantovani, cuidado pra não ficar aparafusando pregos, certo!?
>>
>> []'s
>>
>>
>> 2013/9/3 Solli Honorio <shonorio em gmail.com>
>> Sério mesmo Mantovani que vc acha que um sistema de fila é a solução para eu validar se todos os campos de um formulário estão dentro do aguardado para trabalhar no banco de dados ?
>>
>> Mantovani, só posso dizer que estou orgulhoso de você... vejo que você terá um excelente futuro na industria de tecnologia (coisa que eu não tive), pois este é bem o comportamento dos vendedores de TI. Você está agregando complexidade numa lugar que estou tentando agregar simplicidade :D !!!
>>
>> Abraços,
>>
>> Solli Honorio
>>
>>
>>
>> Em 3 de setembro de 2013 14:58, Daniel de Oliveira Mantovani <daniel.oliveira.mantovani em gmail.com> escreveu:
>>
>> 2013/9/3 Solli Honorio <shonorio em gmail.com>:
>> > Lucas,
>> >
>> > Obrigado pelo retorno. Ontem a noite estudei o código do Data::Manager e ví
>> > que realmente não rola fazer o que eu estava querendo fazer (passar uma
>> > pilha de mensagem e receber de acordo com o contexto) e ai estou
>> > encaminhando para a mesma solução que você.
>>
>> " o que eu estava querendo fazer (passar uma pilha de mensagem e
>> receber de acordo com o contexto)"
>>
>> Shonorio, repetindo o AMQP se encaixa perfeitamente. Eu sugiro que
>> você leia o link que eu te enviei. Se um serviço na sua máquina vai te
>> poupar centenas de linhas de código, talvez nessa situação, nesse
>> contexto obscuro no qual não foi definido pelo interlocutor seja uma
>> boa.
>>
>> Se você acha que isso é demais para você, eu sinto muito que alguém
>> com pelo menos 15/20 anos de experiência ainda não saiba formular uma
>> pergunta. Perguntas genéricas, respostas genéricas. E ainda acho
>> extremamente desnecessário o seu ataque gratuito, mas se você ainda
>> não percebeu isso afasta as pessoas da lista.
>>
>> >
>> > Como vc faz com o I18N ?
>> >
>> > O Renato Cron publicou um 'template' ( https://github.com/AwareTI/MyApp )
>> > de como eles estão utilizando o Data::Manager. Estudei o código e achei
>> > engenhoso, mas ainda quero manter um melhor controle do ResultSet porquê
>> > quero devolver uma estrutura mais complexa de informação.
>> >
>> > Abraços,
>> >
>> > Solli Honorio
>> >
>> >
>> >
>> > 2013/9/3 Lucas Oliveira <lucasmateus.oliveira em gmail.com>
>> >>
>> >>
>> >> Normalmente eu uso sempre com I18N mas da pra quebrar o galho assim
>> >>
>> >> <code>
>> >> #!/usr/bin/env perl
>> >>
>> >> use common::sense;
>> >> use Data::Manager;
>> >> use Data::Verifier;
>> >>
>> >> my %msg_data = (
>> >> missing_name_last => 'Nao foi informado o campo name_last, seu idiota
>> >> !',
>> >> );
>> >>
>> >> sub messages { $msg_data{$_[0]} || $_[0] }
>> >>
>> >> my $dm = Data::Manager->new;
>> >> my $dv = Data::Verifier->new(
>> >> filters => [ qw(trim) ],
>> >> profile => {
>> >> name_first => {
>> >> required => 1,
>> >> type => 'Str',
>> >> filters => [ qw(collapse) ]
>> >> },
>> >> name_last => {
>> >> required => 1,
>> >> type => 'Str',
>> >> filters => [ qw(collapse) ]
>> >> },
>> >> age => {
>> >> type => 'Int'
>> >> },
>> >> sign => {
>> >> required => 1,
>> >> type => 'Str'
>> >> }
>> >> }
>> >> );
>> >>
>> >> $dm->set_verifier( name => $dv );
>> >> $dm->verify( name => { name_first => 'Solli' });
>> >>
>> >> if (!$dm->success) {
>> >> print &messages( $_->msgid ).$/
>> >> foreach (@{ $dm->messages->messages });
>> >> }
>> >> </code>
>> >>
>> >>
>> >> Em 02/09/2013, às 11:10, Solli Honorio <shonorio em gmail.com> escreveu:
>> >>
>> >> Pessoal,
>> >>
>> >> Estou tentando configurar uma mensagem padronização no Data::Manager, mas
>> >> não está funcionando. Alguém aqui já utilizou o Data::Manager para saber se
>> >> é possível fazer isto que eu quero ?
>> >>
>> >> O código abaixo, estou criando uma mensagem e adicionando no Data::Manger,
>> >> porquê eu imaginei que quando ocorrer o problema dentro do escopo e msgid,
>> >> eu teria o texto padronizado, mas o que estou recebendo é mais uma pilha de
>> >> mensagem, mesmo quando não existe o erro.
>> >>
>> >> <code>
>> >> #!/usr/bin/env perl
>> >> use common::sense;
>> >> use Data::Manager;
>> >> use Data::Verifier;
>> >> use Data::Printer;
>> >>
>> >> my $msg = Message::Stack->new;
>> >> $msg->add({
>> >> msgid => 'missing_name_last',
>> >> level => 'error',
>> >> scope => 'name1',
>> >> subject => 'name_last',
>> >> text => 'Não foi informado o campo name_last, seu idiota !'} );
>> >>
>> >> my $dm = Data::Manager->new( { messages => $msg } );
>> >> my $dv = Data::Verifier->new(
>> >> filters => [ qw(trim) ],
>> >> profile => {
>> >> name => {
>> >> required => 1,
>> >> type => 'Str',
>> >> filters => [ qw(collapse) ]
>> >> },
>> >> age => {
>> >> type => 'Int'
>> >> },
>> >> sign => {
>> >> required => 1,
>> >> type => 'Str'
>> >> }
>> >> }
>> >> );
>> >>
>> >>
>> >> };
>> >>
>> >>
>> >> $dm->set_verifier('name1', $verifier);
>> >> $dm->verify('name1', { name_last => 'Honorio', name_first => 'Solli' });
>> >>
>> >> my $results = $dm->get_results('name1');
>> >> my $stack = $dm->messages_for_scope('name1');
>> >>
>> >> say $results->success;
>> >>
>> >> say "Is invalid name_first ", $results->is_invalid('name_first');
>> >> say "Is invalid name_last ", $results->is_invalid('name_last'); # yes
>> >>
>> >> say "Is missing name_first ", $results->is_missing('name_first'); # no
>> >> say "Is missing is_missing ", $results->is_missing('name_last'); # yes
>> >>
>> >> say "Missing count ", $results->missing_count;
>> >>
>> >> say "Count : ", $stack->count ;
>> >> p $stack->get_message( 0 );
>> >> p $stack->get_message( 1 );
>> >>
>> >> </code>
>> >>
>> >>
>> >> --
>> >> "o animal satisfeito dorme". - Guimarães Rosa
>> >> =begin disclaimer
>> >> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>> >> SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>> >> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>> >> =end disclaimer
>> >>
>> >>
>> >>
>> >> =begin disclaimer
>> >> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>> >> SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>> >> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>> >> =end disclaimer
>> >>
>> >
>> >
>> >
>> > --
>> > "o animal satisfeito dorme". - Guimarães Rosa
>> >
>> > =begin disclaimer
>> > Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>> > SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>> > L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>> > =end disclaimer
>> >
>>
>>
>>
>> --
>>
>> -dom
>>
>> --
>>
>> Daniel de Oliveira Mantovani
>> Business Analytic Specialist
>> Perl Evangelist /Astrophysics hobbyist.
>> +55 11 9 8538-9897
>> XOXO
>> =begin disclaimer
>> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>> SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>> =end disclaimer
>>
>>
>>
>> --
>> "o animal satisfeito dorme". - Guimarães Rosa
>>
>> =begin disclaimer
>> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>> SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>> =end disclaimer
>>
>>
>>
>> =begin disclaimer
>> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>> SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>> =end disclaimer
>>
>>
>>
>>
>> --
>> "o animal satisfeito dorme". - Guimarães Rosa
>>
>> =begin disclaimer
>> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>> SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>> =end disclaimer
>>
>>
>> =begin disclaimer
>> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
>> SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
>> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
>> =end disclaimer
>
>
> =begin disclaimer
> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
> SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
>
>
>
> =begin disclaimer
> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
> SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
>
>
> =begin disclaimer
> Sao Paulo Perl Mongers: http://sao-paulo.pm.org/
> SaoPaulo-pm mailing list: SaoPaulo-pm em pm.org
> L<http://mail.pm.org/mailman/listinfo/saopaulo-pm>
> =end disclaimer
-------------- Pr?xima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/saopaulo-pm/attachments/20130905/3853759d/attachment-0001.html>
More information about the SaoPaulo-pm
mailing list