Vou fazer aqui um exemplo e mando.. 2009/2/6 Luciano Soares <[email protected]>
> Marcus vc poderia dar um exemplo usando aquele exemplo das cartas de como > vc implemente o Service Layer? > > Acho que seria de uma grande ajuda pro pessoal e poderia ser > disponibilizado no site do CI. > > Até mais. > > 2009/2/6 Marcus Cavalcanti <[email protected]> > >> Esse "scan" da revista diz bem o que estou querendo dizer e o inverso que >> o BambooInvoice faz. >> >> >> 2009/2/6 Marcus Cavalcanti <[email protected]> >> >>> Acadei dando um "send" sem querer, mas continuando.. >>> >>> O cachorro que deve conhecer os seus métodos, se ele deve latir alto ou >>> baixo (regra d enegócio/validação) é ele quem deve conhecer e não a >>> aplicação, pois isso diz respeito ao cachorro e não a aplicação então qual >>> sentido de ter isso no controller? >>> >>> Quando você tem duas entidades, por exemplo, um método "enviarCarta" você >>> está dizendo respeito na verdade a duas entidades: carta e pessoa. Pessoa pq >>> alguém envia uma carta e nesse caso é uma pessoa, então vocês devem estar se >>> perguntando: Isso fica em qual das duas classes? A resposta é nenhuma, isso >>> deveria ficar em outra camada, na qual chamam de "Services Layer" que é >>> responsável por implementar isso. >>> >>> Essas questões divergem, tem várias oponiçoes, o negócio é tentar pensar >>> nas coisas como objetos. Sinceramente o MVC que o CI implementa não é um MVC >>> como foi proposto, o pattern mesmo, mas é como o CI implementa. >>> >>> Eu nunca tenha regras de negócio no meu controller, ou é no model ou >>> tenho uma camada a mais, conforme já citei. >>> >>> Esse é um bom assunto a ser discutido aqui e a propósito eu acho essa app >>> BambooInvoice um péssimo exemplo. >>> >>> 2009/2/6 Marcus Cavalcanti <[email protected]> >>> >>> hahaha adoro essas discussões... >>>> >>>> Pensando no MVC, o que o Luciano botou é o certo a ser feito. >>>> >>>> Controllers não devem ter regras de negócio da aplicação, controllers >>>> não conhecem isso, apenas direcionam a aplicação. >>>> >>>> Em OO purista e como deveria ser, segundo Domain Driven Design, as >>>> informações e regras de negócio de uma entidade deveriam dizer respeito a >>>> ela e não a um controller, lembre-se, aprendemos OO da seguinte forma: >>>> >>>> class Cachorro extends Mamifero { >>>> public function latir() { >>>> >>>> } >>>> >>>> >>>> >>>> 2009/2/6 Eric Saboia (Fortes Informatica) < >>>> [email protected]> >>>> >>>> Concordo, >>>>> Só complementando, regras genéricas como "validação, redimensionamento >>>>> de uma imagem, apuramento de dados e etc" devem sim ser utilizadas no >>>>> Model, >>>>> porém, se não tem ligação direta com o domínio do model em questão, podem >>>>> ficar separadas em um helper ou library. >>>>> >>>>> Não faz muito sentido você dar load em um Model diferente do domínio >>>>> atual, só pra aproveitar algum método, melhor é deixar essas regras >>>>> encapsuladas e chamar diretamente dentro de cada Model necessário. >>>>> >>>>> Mas isso já diz mais respeito a DDD do que ao MVC em si (eu acho), e é >>>>> claro, como tudo que estudamos, é sempre uma sugestão de boa conduta de >>>>> desenvolvimento, não estou dizendo que é uma regra ;) >>>>> >>>>> ----- Original Message ----- >>>>> *From:* Ricardo Valfreixo <[email protected]> >>>>> *To:* CodeIgniter Brasil <[email protected]> >>>>> *Sent:* Friday, February 06, 2009 5:57 AM >>>>> *Subject:* Re: [CodeIgniter] MVC de verdade >>>>> >>>>> >>>>> Não existe um papel claro escrito na pedra. Existem ferramentas e >>>>> práticas. De uma forma geral , é apenas bom senso. O CI é fabuloso porque >>>>> nos dá liberdade para fazermos a aplicação da forma que quisermos. E é mau >>>>> porque nos dá liberdade para fazermos a aplicação da forma que quiseres >>>>> eheheh. >>>>> >>>>> Com o codeigniter não precisas sequer de usar models e views. Pode >>>>> simplesmente usar controllers, fazer chamadas directas ao banco de dados e >>>>> produzir echos para visualização. No entanto estão lá as outras estruturas >>>>> para nos ajudar a vida. >>>>> >>>>> Colocar código nos models é uma boa ideia por muitos motivos. Mas vou >>>>> dar apenas um para te por a pensar. Se quiseres reutilizar um código (um >>>>> qualquer, validação, redimensionamento de uma imagem, apuramento de dados, >>>>> etc) onde é mais simples de colocar para ser utilizado em qualquer lado? >>>>> >>>>> Se for no controlador, terá de usar copy/paste para reproduzir. >>>>> Enquanto se estiver num model é apenas fazer load do model e usar o >>>>> método. >>>>> >>>>> Para mim e cada vez mais para os utilizadores de arquitecturas MVC a >>>>> regra é deixar os controladores o mais magro possível e deixar os models >>>>> engordar à vontade. >>>>> >>>>> Agora a decisão é sempre tua :) >>>>> >>>>> //Zen >>>>> >>>>> >>>>> >>>>> >>>>> 2009/2/5 Eric Saboia (Fortes Informatica) < >>>>> [email protected]> >>>>> >>>>>> Cara, eu lembro que já foi discutido sim, mas não especificamente >>>>>> sobre o MVC, tanto que pra mim (e pelo visto pra maioria aqui) não havia >>>>>> ficado claro o papel de cada camada. >>>>>> >>>>>> ----- Original Message ----- From: "Newton Wagner" < >>>>>> [email protected]> >>>>>> To: "CodeIgniter Brasil" <[email protected]> >>>>>> Sent: Thursday, February 05, 2009 5:54 PM >>>>>> >>>>>> Subject: Re: [CodeIgniter] MVC de verdade >>>>>> >>>>>> >>>>>> E é por isso que alguns frameworks criam outra camada além do Model, a >>>>>> de Persistência. Aí fica mais bem separado ainda! :). >>>>>> >>>>>> Realmente essa discussão já foi abordada aqui na lista... quem quiser >>>>>> pode procurar no histórico. >>>>>> >>>>>> >>>>>> 2009/2/5 Cleyverson Costa <[email protected]>: >>>>>> >>>>>>> OK Valeu! >>>>>>> >>>>>>> 2009/2/5 Eric Saboia (Fortes Informatica) < >>>>>>> [email protected]> >>>>>>> >>>>>>>> >>>>>>>> Cleyverson, >>>>>>>> se você usa Active Record, teoricamente a mudança entre banco de >>>>>>>> dados é >>>>>>>> transparente. além disso, nada impede que você isole as querys das >>>>>>>> regas de >>>>>>>> negócio... da uma lida sobre DDD. >>>>>>>> >>>>>>>> Valeu! >>>>>>>> >>>>>>>> ----- Original Message ----- >>>>>>>> From: Cleyverson Costa >>>>>>>> To: CodeIgniter Brasil >>>>>>>> Sent: Thursday, February 05, 2009 3:32 PM >>>>>>>> Subject: Re: [CodeIgniter] MVC de verdade >>>>>>>> Mas pensem, se eu colocar a validação dentro do model e quiser >>>>>>>> trocar o >>>>>>>> banco de dados...??? >>>>>>>> >>>>>>>> Isso vai me dar uma grande dor d cabeça... >>>>>>>> >>>>>>>> Regra de negocio eu chamo de validações, ifs e elses etc que vai >>>>>>>> dizzer o >>>>>>>> que fazer...pra mim nao ta tendo logica isso ficar dentro do model. >>>>>>>> >>>>>>>> Abraços >>>>>>>> >>>>>>>> 2009/2/5 Eric Saboia (Fortes Informatica) < >>>>>>>> [email protected]> >>>>>>>> >>>>>>>>> >>>>>>>>> Se os "criadores" do CI trabalham de forma errada, porque algum de >>>>>>>>> nós >>>>>>>>> faria diferente? Fiquei com a pulga atrás da orelha agora em >>>>>>>>> relação ao CI >>>>>>>>> :( >>>>>>>>> >>>>>>>>> ----- Original Message ----- >>>>>>>>> From: Vinicius Cruz >>>>>>>>> To: CodeIgniter Brasil >>>>>>>>> Sent: Thursday, February 05, 2009 3:00 PM >>>>>>>>> Subject: Re: [CodeIgniter] MVC de verdade >>>>>>>>> Acho que aprendi tudo errado ... O_o >>>>>>>>> O sistema aqui do trampo tá igual ao Bamboo. >>>>>>>>> >>>>>>>>> 2009/2/5 Luciano Soares <[email protected]> >>>>>>>>> >>>>>>>>>> >>>>>>>>>> Mais informações >>>>>>>>>> >>>>>>>>>> http://java.sun.com/blueprints/patterns/MVC-detailed.html >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> Participants & Responsibilities >>>>>>>>>> >>>>>>>>>> The MVC architecture has its roots in Smalltalk, where it was >>>>>>>>>> originally >>>>>>>>>> applied to map the traditional input, processing, and output tasks >>>>>>>>>> to the >>>>>>>>>> graphical user interaction model. However, it is straightforward >>>>>>>>>> to map >>>>>>>>>> these concepts into the domain of multi-tier enterprise >>>>>>>>>> applications. >>>>>>>>>> >>>>>>>>>> Model - The model represents enterprise data and the business >>>>>>>>>> rules that >>>>>>>>>> govern access to and updates of this data. Often the model serves >>>>>>>>>> as a >>>>>>>>>> software approximation to a real-world process, so simple >>>>>>>>>> real-world >>>>>>>>>> modeling techniques apply when defining the model. >>>>>>>>>> View -The view renders the contents of a model. It accesses >>>>>>>>>> enterprise >>>>>>>>>> data through the model and specifies how that data should be >>>>>>>>>> presented. It >>>>>>>>>> is the view's responsibility to maintain consistency in its >>>>>>>>>> presentation >>>>>>>>>> when the model changes. This can be achieved by using a push >>>>>>>>>> model, where >>>>>>>>>> the view registers itself with the model for change notifications, >>>>>>>>>> or a pull >>>>>>>>>> model, where the view is responsible for calling the model when it >>>>>>>>>> needs to >>>>>>>>>> retrieve the most current data. >>>>>>>>>> Controller - The controller translates interactions with the view >>>>>>>>>> into >>>>>>>>>> actions to be performed by the model. In a stand-alone GUI client, >>>>>>>>>> user >>>>>>>>>> interactions could be button clicks or menu selections, whereas in >>>>>>>>>> a Web >>>>>>>>>> application, they appear as GET and POST HTTP requests. The >>>>>>>>>> actions >>>>>>>>>> performed by the model include activating business processes or >>>>>>>>>> changing the >>>>>>>>>> state of the model. Based on the user interactions and the outcome >>>>>>>>>> of the >>>>>>>>>> model actions, the controller responds by selecting an appropriate >>>>>>>>>> view. >>>>>>>>>> >>>>>>>>>> 2009/2/5 Luciano Soares <[email protected]> >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> Bom nesse link da wikiedia em ingles explica o tradicional modelo >>>>>>>>>>> MVC >>>>>>>>>>> (que é diferente daquele implementado pelo CI devido as >>>>>>>>>>> restrições de não >>>>>>>>>>> criãção de observers em PHP) >>>>>>>>>>> >>>>>>>>>>> http://en.wikipedia.org/wiki/Model-view-controller >>>>>>>>>>> >>>>>>>>>>> As a design pattern >>>>>>>>>>> >>>>>>>>>>> MVC encompasses more of the architecture of an application than >>>>>>>>>>> is >>>>>>>>>>> typical for a design pattern.[citation needed] >>>>>>>>>>> >>>>>>>>>>> Model Is the domain-specific representation of the information on >>>>>>>>>>> which >>>>>>>>>>> the application operates. Domain logic adds meaning to raw data >>>>>>>>>>> (for >>>>>>>>>>> example, calculating whether today is the user's birthday, or the >>>>>>>>>>> totals, >>>>>>>>>>> taxes, and shipping charges for shopping cart items). Many >>>>>>>>>>> applications use >>>>>>>>>>> a persistent storage mechanism (such as a database) to store >>>>>>>>>>> data. MVC does >>>>>>>>>>> not specifically mention the data access layer because it is >>>>>>>>>>> understood to >>>>>>>>>>> be underneath or encapsulated by the model. View Renders the >>>>>>>>>>> model into a >>>>>>>>>>> form suitable for interaction, typically a user interface >>>>>>>>>>> element. Multiple >>>>>>>>>>> views can exist for a single model for different purposes. >>>>>>>>>>> Controller >>>>>>>>>>> Processes and responds to events (typically user actions) and may >>>>>>>>>>> indirectly >>>>>>>>>>> invoke changes on the model. >>>>>>>>>>> >>>>>>>>>>> 2009/2/5 Luciano Soares <[email protected]> >>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Controladores se preocupam apenas com o fluxo das operações >>>>>>>>>>>> dentro de >>>>>>>>>>>> um modelo MVC. >>>>>>>>>>>> >>>>>>>>>>>> O modelo é onde ficam as regras de negócio. >>>>>>>>>>>> >>>>>>>>>>>> 2009/2/5 Cairo Noleto <[email protected]> >>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> No Rails, os métodos de um controller são chamadas de actions, >>>>>>>>>>>>> que >>>>>>>>>>>>> realmente passam a ação do que se vai fazer, em um crud temos >>>>>>>>>>>>> as seguintes >>>>>>>>>>>>> ações: >>>>>>>>>>>>> Create, Read, Update e Destroy. >>>>>>>>>>>>> >>>>>>>>>>>>> no rails teríamos os seguintes métodos >>>>>>>>>>>>> >>>>>>>>>>>>> def index >>>>>>>>>>>>> end >>>>>>>>>>>>> def new >>>>>>>>>>>>> end >>>>>>>>>>>>> def edit >>>>>>>>>>>>> end >>>>>>>>>>>>> def save >>>>>>>>>>>>> end >>>>>>>>>>>>> def destroy >>>>>>>>>>>>> end >>>>>>>>>>>>> def show >>>>>>>>>>>>> end >>>>>>>>>>>>> >>>>>>>>>>>>> Isso seria as ações da aplicação. >>>>>>>>>>>>> >>>>>>>>>>>>> "Um colaborador pode criar uma nova venda" sales/new >>>>>>>>>>>>> "Um colaborador pode vizualizar uma venda" sales/1/show >>>>>>>>>>>>> "Um colaborador pode editar uma venda" sales/2/edit >>>>>>>>>>>>> "Um colaborador pode excluir uma venda" sales/1/destroy >>>>>>>>>>>>> >>>>>>>>>>>>> Claro que isso é a grosso modo, hoje existe formas melhores de >>>>>>>>>>>>> se >>>>>>>>>>>>> fazer isso no rails usando o conceito de rest web service. Mas >>>>>>>>>>>>> idéia é >>>>>>>>>>>>> justamente essa, fazer com que um determinado controle expresse >>>>>>>>>>>>> apenas as >>>>>>>>>>>>> ações >>>>>>>>>>>>> >>>>>>>>>>>>> 2009/2/5 Cleyverson Costa <[email protected]> >>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> Eric, >>>>>>>>>>>>>> >>>>>>>>>>>>>> De tudo o que ja li, o uso correto é da seguinte forma: >>>>>>>>>>>>>> >>>>>>>>>>>>>> Model >> Aqui tem basicamente as chamadas ao BD. Pense na se >>>>>>>>>>>>>> seguinte situação. Opa minha empresa vai mudar de banco de >>>>>>>>>>>>>> dados, entao as >>>>>>>>>>>>>> consultas SQL deverao ser modificadas. Se vc tiver no model >>>>>>>>>>>>>> apenas as >>>>>>>>>>>>>> chamadas ao banco, vc modifica apenas esta camada. Vc modifica >>>>>>>>>>>>>> os sql e todo >>>>>>>>>>>>>> o resto continua funcionando. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Controller >> Aqui ficam as regras de negocio e validações >>>>>>>>>>>>>> etc. Tudo >>>>>>>>>>>>>> fica aqui. Esta é sua camada de negocio. >>>>>>>>>>>>>> >>>>>>>>>>>>>> View >> Aqui fica a apresentação. Muita gente acaba colocando >>>>>>>>>>>>>> o >>>>>>>>>>>>>> utf8_encode/decode na view, mas acho que nao seria uma boa >>>>>>>>>>>>>> pratica. Quanto >>>>>>>>>>>>>> mais limpo vc puder deixar a view (usando o controller) >>>>>>>>>>>>>> melhor. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Depois de muito apanhar esta foi a forma que eu acabei achando >>>>>>>>>>>>>> como >>>>>>>>>>>>>> mais correta. Estou usando esta estrutura no site >>>>>>>>>>>>>> www.ezmatch.net caso >>>>>>>>>>>>>> queira dar uma olhada. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Abraços >>>>>>>>>>>>>> >>>>>>>>>>>>>> 2009/2/5 Eric Saboia (Fortes Informatica) >>>>>>>>>>>>>> <[email protected]> >>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Pessoal, pedi antes de ontem um exemplo de aplicação bem >>>>>>>>>>>>>>> feita em >>>>>>>>>>>>>>> CI, me indicaram o http://www.bambooinvoice.org/ . Eu estava >>>>>>>>>>>>>>> querendo checar >>>>>>>>>>>>>>> o uso do MVC dentro de uma aplicação em CodeIgniter, mas me >>>>>>>>>>>>>>> deparei com o >>>>>>>>>>>>>>> mesmo "erro" que julgava estar acontecendo aqui na empresa. O >>>>>>>>>>>>>>> controller tá >>>>>>>>>>>>>>> cheio de regras de negócio, assim como validações e etc. Isso >>>>>>>>>>>>>>> tudo não >>>>>>>>>>>>>>> deveria estar no Model? Pois até onde sei o modelo representa >>>>>>>>>>>>>>> tanto a >>>>>>>>>>>>>>> persistência, quanto o negócio, enquanto o Controller é >>>>>>>>>>>>>>> responsável >>>>>>>>>>>>>>> unicamente pelo fluxo da aplicação. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Opniões? >>>>>>>>>>>>>>> Eric Saboia >>>>>>>>>>>>>>> Desenvolvimento Web >>>>>>>>>>>>>>> Fortes Informática (Fortaleza) >>>>>>>>>>>>>>> Fone: (85) 4005-1111 >>>>>>>>>>>>>>> [email protected] >>>>>>>>>>>>>>> www.grupofortes.com.br >>>>>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>>>>> Lista mailing list >>>>>>>>>>>>>>> [email protected] >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>>>> Lista mailing list >>>>>>>>>>>>>> [email protected] >>>>>>>>>>>>>> >>>>>>>>>>>>>> http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> Cairo Noleto >>>>>>>>>>>>> ========= >>>>>>>>>>>>> Cairo'sBlog - http://www.caironoleto.com/ >>>>>>>>>>>>> Web developer - Add4 Comunicação - http://www.add4.com.br/ >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>>> Lista mailing list >>>>>>>>>>>>> [email protected] >>>>>>>>>>>>> >>>>>>>>>>>>> http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> _______________________________________________ >>>>>>>>>> Lista mailing list >>>>>>>>>> [email protected] >>>>>>>>>> >>>>>>>>>> http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br >>>>>>>>>> >>>>>>>>>> >>>>>>>>> ________________________________ >>>>>>>>> >>>>>>>>> _______________________________________________ >>>>>>>>> Lista mailing list >>>>>>>>> [email protected] >>>>>>>>> http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br >>>>>>>>> >>>>>>>>> _______________________________________________ >>>>>>>>> Lista mailing list >>>>>>>>> [email protected] >>>>>>>>> http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br >>>>>>>>> >>>>>>>>> >>>>>>>> ________________________________ >>>>>>>> >>>>>>>> _______________________________________________ >>>>>>>> Lista mailing list >>>>>>>> [email protected] >>>>>>>> http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br >>>>>>>> >>>>>>>> _______________________________________________ >>>>>>>> Lista mailing list >>>>>>>> [email protected] >>>>>>>> http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> _______________________________________________ >>>>>>> Lista mailing list >>>>>>> [email protected] >>>>>>> http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Newton Wagner >>>>>> >>>>>> skype: newtonwagner >>>>>> msn/gtalk: [email protected] >>>>>> >>>>>> http://www.newtonwagner.net/ >>>>>> - http://www.owshit.com.br/ >>>>>> >>>>>> _______________________________________________ >>>>>> Lista mailing list >>>>>> [email protected] >>>>>> http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br >>>>>> >>>>>> _______________________________________________ >>>>>> Lista mailing list >>>>>> [email protected] >>>>>> http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br >>>>>> >>>>> >>>>> ------------------------------ >>>>> >>>>> _______________________________________________ >>>>> Lista mailing list >>>>> [email protected] >>>>> http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br >>>>> >>>>> >>>>> _______________________________________________ >>>>> Lista mailing list >>>>> [email protected] >>>>> http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br >>>>> >>>>> >>>> >>>> >>>> -- >>>> Marcus Cavalcanti >>>> 21 9144-5068 >>>> www.marcuscavalcanti.net/blog >>>> >>> >>> >>> >>> -- >>> Marcus Cavalcanti >>> 21 9144-5068 >>> www.marcuscavalcanti.net/blog >>> >> >> >> >> -- >> Marcus Cavalcanti >> 21 9144-5068 >> www.marcuscavalcanti.net/blog >> >> _______________________________________________ >> Lista mailing list >> [email protected] >> http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br >> >> > > _______________________________________________ > Lista mailing list > [email protected] > http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br > > -- Marcus Cavalcanti 21 9144-5068 www.marcuscavalcanti.net/blog
_______________________________________________ Lista mailing list [email protected] http://codeigniter.com.br/mailman/listinfo/lista_codeigniter.com.br

