<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>