<p>Não há briga, André. :)</p>
<p>Eu só estou tentando mostrar onde vejo complexidade no Catalyst.</p>
<p>Creio que muita gente tem a mesma impressão.</p>
<p>[]s</p>
<div class="gmail_quote">Op 13 jul. 2011 14:36 schreef "André Walker" <<a href="mailto:andre@andrewalker.net">andre@andrewalker.net</a>> het volgende:<br type="attribution">> Eu acho que está havendo uma pequena confusão aqui. O Catalyst não foi <br>
> feito para rodar um Hello World. Foi feito para estimular boas práticas <br>> de desenvolvimento de webapps, e ajudar o desenvolvedor a deixar seu <br>> código com uma fácil manutenção. Por que você iria criar um modelo, uma <br>
> view, e um controller separados apenas pra rodar um Hello World? Se sua <br>> aplicação é tão simples assim, talvez você não devesse usar Catalyst <br>> mesmo (Eden, não me mate!!).<br>> <br>> <a href="http://www.shadowcat.co.uk/archive/conference-video/nwepm/catalyst-dbic/">http://www.shadowcat.co.uk/archive/conference-video/nwepm/catalyst-dbic/</a><br>
> <br>> Catalyst não tem screencasts populares de se fazer blogs em 10 minutos, <br>> mas com ele você produz sistemas que você pode voltar meses, anos <br>> depois, e vai conseguir manter com facilidade.<br>> <br>
> Se simplicidade é menos linhas código, experimente estes exemplos:<br>> <br>> <?php echo "Hello world" ?><br>> <br>> use CGI;<br>> print "Content-type: text/html\n\nHello world";<br>
> <br>> Funcionam perfeitamente também.<br>> <br>> O código que você colou de sessões no Catalyst é bem diferente do <br>> exemplo que você deu do Mojolicious. Faz coisas diferentes, e contém um <br>> monte de comentários, por isso é maior. Só porque o código de exemplo é <br>
> mais amplo não significa que o resultado final é mais complexo.<br>> <br>> Na minha opinião, tudo se resume a usar a ferramenta correta para o <br>> projeto, cada uma tem prós e contras. E o resto é apenas preferência. <br>
> TIMTOWTDI. Não sei por que tanta briga.<br>> <br>> Abraços!<br>> André<br>> <br>> On 07/13/2011 06:48 AM, Nelson Ferraz wrote:<br>>> Simplicidade é algo difícil de definir, mas todo mundo consegue <br>
>> identificar.<br>>><br>>> Vamos começar com um exemplo que eu considero simples:<br>>><br>>><br>>>        use Mojolicious::Lite;<br>>><br>>>        get '/' => sub {<br>
>>            my $self = shift;<br>>>            my $name = $self->param('name') || 'world';<br>>>            $self->render( text => "Hello, $name" );<br>>>        };<br>
>><br>>>        app->start();<br>>><br>>><br>>><br>>> Esta é uma aplicação mínima, porém completa. Você pode executá-la e <br>>> testá-la em <a href="http://localhost:3000">http://localhost:3000</a>.<br>
>><br>>> Agora, vamos dizer que eu queira usa um template:<br>>><br>>><br>>>        use Mojolicious::Lite;<br>>><br>>>        get '/' => sub {<br>>>            my $self = shift;<br>
>>            my $name = $self->param('name') || 'world';<br>>> *$self->stash( name => $name )*;<br>>>        } *=> 'index';*<br>>><br>>>        app->start();<br>
>><br>>> *       __DATA__<br>>>        @@ index.html.ep<br>>> <h1>Hello, <%= $name %>!</h1>*<br>>><br>>><br>>><br>>> (Sob o ponto de vista didático é conveniene mostrar o template junto <br>
>> com o código, para que as pessoas possam copiar e colar; na prática eu <br>>> criaria um arquivo dentro de um diretório chamado "templates", que <br>>> seria reconhecido automaticamente.)<br>
>><br>>> E se eu quiser usar um arquivo de configuração? Basta criar um arquivo <br>>> chamado "app.conf". (Onde "app" é igual ao nome da aplicação). Exemplo:<br>>><br>>><br>
>>        {<br>>>            default_name => 'world'<br>>>        }<br>>><br>>><br>>><br>>> Para usar o arquivo de configuração:<br>>><br>>><br>>><br>
>>        use Mojolicious::Lite;<br>>><br>>> *       plugin 'config';<br>>> *<br>>>        get '/' => sub {<br>>>            my $self = shift;<br>>>            my $name = $self->param('name') || <br>
>> *$self->config('default_name')*;<br>>>            $self->stash( name => $name );<br>>>        } => 'index';<br>>><br>>>        app->start();<br>>><br>>>        __DATA__<br>
>>        @@ index.html.ep<br>>> <h1>Hello, <%= $name %>!</h1><br>>><br>>><br>>><br>>> Se você quiser acessar a variável de configuração a partir do template:<br>>><br>
>><br>>>        use Mojolicious::Lite;<br>>><br>>>        plugin 'config';<br>>><br>>>        get '/' => sub {<br>>>            my $self = shift;<br>>>            my $name = $self->param('name');<br>
>>            $self->stash( name => $name );<br>>>        } => 'index';<br>>><br>>>        app->start();<br>>><br>>>        __DATA__<br>>>        @@ index.html.ep<br>
>> <h1>Hello, <%= $name *|| config('default_name')* %>!</h1><br>>><br>>><br>>><br>>> Vamos, agora, guardar o nome em uma variável de sessão:<br>>><br>>><br>
>>         use Mojolicious::Lite;<br>>><br>>>         plugin 'config';<br>>>         get '/' => sub {<br>>>             my $self = shift;<br>>><br>>>             my $name = $self->param('name')<br>
>> *                    || $self->session('name')*<br>>>                     || $self->config('default_name');<br>>><br>>> *            $self->session( name => $name );*<br>
>><br>>>             $self->stash( name => $name );<br>>>         } => 'index';<br>>>             app->start();<br>>>         __DATA__<br>>>         @@ index.html.ep<br>
>> <h1>Hello, <%= $name %>!</h1><br>>><br>>><br>>><br>>> Aí está: um exemplo completo, com template, arquivo de configuração <br>>> externo, e sessão.<br>>><br>>> Compare com a página de documentação do Catalyst::Plugin::Session:<br>
>><br>>>      # To get sessions to "just work", all you need to do is use these plugins:<br>>><br>>>      use  Catalystqw/<br>>>        Session<br>>>        Session::Store::FastMmap<br>
>>        Session::State::Cookie<br>>>        /;<br>>><br>>>      # you can replace Store::FastMmap with Store::File - both have sensible<br>>>      # default configurations (see their docs for details)<br>
>><br>>>      # more complicated backends are available for other scenarios (DBI storage,<br>>>      # etc)<br>>><br>>><br>>>      # after you've loaded the plugins you can save session data<br>
>>      # For example, if you are writing a shopping cart, it could be implemented<br>>>      # like this:<br>>><br>>>      sub  add_item:  Local{<br>>>          my  (  $self,  $c  )  =  @_;<br>
>><br>>>          my  $item_id  =  $c->req->param("item");<br>>><br>>>          # $c->session is a hash ref, a bit like $c->stash<br>>>          # the difference is that it' preserved across requests<br>
>><br>>>          push  @{  $c->session->{items}  },  $item_id;<br>>><br>>>          $c->forward("MyView");<br>>>      }<br>>><br>>>      sub  display_items:  Local{<br>
>>          my  (  $self,  $c  )  =  @_;<br>>><br>>>          # values in $c->session are restored<br>>>          $c->stash->{items_to_display}  =<br>>>            [  map  {  MyModel->retrieve($_)  }  @{  $c->session->{items}  }  ];<br>
>><br>>>          $c->forward("MyView");<br>>>      }<br>>><br>>> Este é o "problema de complexidade".<br>>><br>>> Se o Catalyst::Lite puder reunir a simplicidade do Mojolicious com a <br>
>> solidez do Catalyst, creio que este será o melhor dos dois mundos.<br>>><br>>> []s<br>>><br>>> Nelson<br>>><br>>><br>>> =begin disclaimer<br>>>     Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/">http://sao-paulo.pm.org/</a><br>
>>   SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a><br>>>   L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
>> =end disclaimer<br>> <br></div>