Ok,<div><br></div><div>Depois de ler o excelente '10 Catalyst models in 10 days' (<a href="http://sedition.com/a/2733" target="_blank">http://sedition.com/a/2733</a>) descobri que eu estava fazendo um enorme confusão entre model e schema.<br>

<br>Estou colocando em práticas algumas coisas que eu desmitifiquei e volto com mais dúvidas logo.<br><br>Solli Honorio<br>
<br><div class="gmail_quote">Em 8 de junho de 2012 10:29, Eden Cardim <span dir="ltr"><<a href="mailto:edencardim@gmail.com" target="_blank">edencardim@gmail.com</a>></span> escreveu:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


>>>>> "Solli" == Solli Honorio <<a href="mailto:shonorio@gmail.com" target="_blank">shonorio@gmail.com</a>> writes:<br>
<br>
    Solli> Por exemplo, tenho que receber um arquivo de imagem, que deverá ser<br>
    Solli> validada (se é uma imagem mesmo, etc), depois relacionar ao usuário<br>
    Solli> e armazenar em um storage.<br>
<br>
    Solli> Nesta situação eu tenho diversas tarefas, algumas que seriam<br>
    Solli> natural colocar no controller, outras nem tanto.<br>
<br>
    Solli> Qual a melhor maneira de lidar com isto ?<br>
<br>
Cria uma classe contendo um ou mais métodos que aceitem o usuário, o arquivo e<br>
o storage e que execute as operações necessárias com eles, esse tipo de classe<br>
se chama "Façade" porque fornece acesso simplificado a uma parte mais<br>
complicada da lógica de negócio. A questão é encontrar a melhor forma de<br>
abstrair essas 3 entidades. Por exemplo, elas podem ser modeladas/abstraídas<br>
dentro de suas próprias classes, caso seja necessário. A melhor forma de<br>
pensar em como montar essas classes, é imaginar como você usaria elas fora do<br>
contexto de web app.<br>
<br>
Para abstrair os arquivos, geralmente eu recomendo a API do IO::Handle, ou<br>
seja, você passa um objeto filehandle-like para o método, representando o<br>
arquivo em questão.<br>
<br>
"Storage" é bastante dependente da lógica de negócio, e depende da<br>
flexibilidade que você deseja. Um caso comum é que o seu storage seja um banco<br>
de dados, e nesse caso, a abstração mais óbvia seria um dbh do DBI. Se você<br>
precisar de mais "inteligência" nesse objeto, cria uma classe que encapsule o<br>
dbh e faça as operações adequadas em cima dele (um objeto DBIx::Class::Schema,<br>
por exemplo)<br>
<br>
"User" poderia ser o objeto retornado por $c->user, já que você tá usando<br>
Catalyst. Mas uma abordagem mais flexível seria passar o username ou coisa que<br>
o valha, assim você não fica amarrado numa implementação específica.<br>
<br>
nesse caso, seu model poderia implementar um método assim:<br>
<br>
sub handle {<br>
  my($self, $fh, $dbh, $user) = @_;<br>
  # biz logic goes here<br>
}<br>
<br>
E o seu lean controller ficaria mais ou menos assim:<br>
<br>
sub my_action :Local {<br>
  my($self, $c) = @_;<br>
  $c->model('MyBizClass')<br>
    ->handle($c->req->upload('file')->fh, $c->model('DB')->dbh, $c->user->email);<br>
}<br>
<br>
Assumindo que você esteja pegando o arquivo de um campo upload chamado 'file'<br>
e que tenha um model chamado 'DB' já com um dbh conectado, etc. A mentalidade<br>
do lean controller é apenas a de integrar a sua classe contendo a lógica de<br>
negócio com o contexto da web.<br>
<br>
Observe que você pode usar essa classe de model em qualquer lugar, como por<br>
exemplo, numa utilidade CLI:<br>
<br>
my $biz = MyBizClass->new;<br>
$biz->handle(\*STDIN, DBI->connect($ARGV[0]), $ARGV[1])<br>
<br>
cat arquivo | perl <a href="http://util.pl" target="_blank">util.pl</a> dbi:Pg:dbname=foobar foo@bar.baz<br>
<span><font color="#888888"><br>
--<br>
Eden Cardim<br>
<a href="tel:%2B55%2011%209644%208225" value="+551196448225" target="_blank">+55 11 9644 8225</a><br>
<a href="http://insoli.de" target="_blank">http://insoli.de</a><br>
</font></span><div><div>=begin disclaimer<br>
   Sao Paulo Perl Mongers: <a href="http://sao-paulo.pm.org/" target="_blank">http://sao-paulo.pm.org/</a><br>
 SaoPaulo-pm mailing list: <a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
 L<<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a>><br>
=end disclaimer<br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br>"o animal satisfeito dorme". - Guimarães Rosa<br>
</div>