Pessoal,
Estava pensando sobre o desenvolvimento de um sistema modular (um ERP, CRM, etc), vendido em partes para o cliente e que o código fosse deixado no cliente (nem que fosse criptografado com as diversas ferramentas que há disponível por aí…). Dai pensei, como fazer isso com o CakePHP?!
Pensando, achei que fosse legal criar cada módulo como um plugin, inclusive alguns recursos básicos do sistema, como a parte de autenticação (login). Deixar a ‘app’ como um barramento da aplicação, fornecendo components, helpers, layouts, css/js, vendors, etc. Essa parte funcionaria como uma infra estrutura do sistema, onde as rotas poderiam ser criadas dinâmicamente pelo AppController do plugin ou usar as rotas diretamente do sistema (plugin/controller/action/params).
Hoje o CakePHP dispões de várias funções para identificar se o app possui um componente ou outro plugin instalado, podendo os plugins “se conversarem”. O comando App::listObjects(‘Plugin’), por exemplo é fantástico para saber se um outro módulo também está instalado. Assim não precisaria cadastrar cada módulo numa base de dados, que poderia ser manipulada pelo cliente ou coisa do genero.
O mesmo poderia ser aplicado a uma empresa que possui diversos softwares, não necessariamente inteligados (em módulos). Onde todas as aplicações teriam um ambiente de desenvolvimento comum (barramento) e cada aplicação seria um plugin. Isso reduziria a quantidade de código e, consequentemente, o tamanho da aplicação nos clientes que tiverem mais de uma aplicação.
O que acham? Já passaram por algo assim?
Super interessante,
Para falar a verdade, eu sinto um enorme pena da documentação do CakePHP não incentivar a utilização de Plugins. Eu sei que isso é coisa dos desenvolvedores, que realmente quer programar com reaproveitamento de código vê a estrutura de plugins uma grande parceira.
Não sei se você ficou sabendo, recentemente foi lançado o WildFlower (http://wf.klevo.sk/) que tem uma idéia parecida. Infelizmente, pelo que parece, eles não ainda não fizeram como um plugin, mas a idéia é interessante e muito parecido com o que você propõe (somente retirando o aspecto comercial, visto que o WF é Open-Source).
Eu tenho uma dúvida, você fala em fazer rotas através de AppController, isto é possível?
Vale lembrar também dos códigos Shell, pode-se criar diversos códigos shells de instalação de plugins que poderiam realizar uma infinidade de tarefas de configuração automágicamente.
Boa idéia, só falta uma boa execução.
Abraços!
Comentário por JoaoJose — 25 setembro 2008 @ 10:23 am
João, pensei para uma aplicação comercial por ela é normalmente melhor dividida em módulos para a venda, mas também poderia ser aplicada a outras ferramentas, como CMS (site que você mencionou – particularmente eu não conhecia), gerenciadores de projeto (dotProject, “trac”, etc), entre outros.
A parte de utilizar Shell realmente é muito legal, eu ainda não tenho muito experiência e nem muitas idéias sobre o mesmo, mas pretendo dar uma estudada melhor para ver se vem alguns estalos para desenvolver algo.
Sobre criar rotas no AppController do plugin que eu falei, não seria via chamada de função ou método… seria, por exemplo, na instalação, criar um arquivo tipo bootstrap para que o cake inclua ele depois. Entendeu?
Acho que em tempo de execução não faz sentido, até porque no final da execução vai ser tudo “perdido” e o AppController só é chamado depois do router direcionar o controller.
Abraços e obrigado pela resposta.
Comentário por Juan Basso — 26 setembro 2008 @ 1:58 pm
E ae Juan.
Cara uma vez eu pensei nisso também, na finalidade de criar um gestor de conteúdo usando o cake igual ao joomla.
Seria bem legal pensar numa forma, pq o joomla é legal e talz mas a programação dele é muito desorganizada e difícil de entender.
Sobre o comentrário do blog, eu já tinha visto o ACL Admin e o ACM, só que não consegui fazer eles funcionarem aki em ksa.
P/ vc ver como que as coisas são engraçadas, deve ter sido a 5ª vez q eu peguei o ACL p/ mexer assim sem compromisso sem pressão do chefe nem nada, ai consegui fazer o trem funcionar.
Bem bacana seu blog.
Quando eu tiver tempo quero mexer no layout do meu, colocar + posts.
Vlw pelo comentário.
Flw.
Comentário por Emílio — 30 setembro 2008 @ 11:23 pm
Juan, tenho um projeto correndo muito parecido com a sua idéia. Porém no andar do desenvolvimento percebemos que fazer a modularização a partir de plugins tornava o desenvolvimento mais difícil – maior distribuição de arquivos, muitas convenções desnecessárias – e verborrágico. Com certeza os plugins e suas estruturas são muito interessantes e úteis mas creio que para o desenvolvimento de um projeto que por mais modularizado que seja, sempre leva um pouco do núcleo em todos os módulos – os clientes no CRM serão usados como base para os projetos no PM que por sua vez terão as tarefas que ditarão o faturamento dos empregados no HRM que por sua vez acaba fazendo o abatimento no CM… – e acaba deixando o código todo muito dependente e por isso os plugins perdem um pouco o sentido.
Comentário por rafaelbandeira3 — 13 outubro 2008 @ 12:03 pm
Emilio: obrigado pelo comentário. Sobre o joomla, a equipe do Mambo (base do joomla) está desenvolvendo a nova versão em cima do CakePHP. Eles tinham anunciado isso já faz tempo, mas nunca vi nada em prática. Vamos aguardar e ver se vai sair realmente. Fonte: http://bakery.cakephp.org/articles/view/mambo-licious
Rafael: obrigado pelo comentário também. Neste seu caso, você chegou a pensar em soluções como callbacks? Eu vi no projeto do bakesale (http://www.bakesalehq.com) que ele usava um callback para os plugins, com isso, quando algo ia ser executado, ele mandava chamava um callback e quem tinha aquele método implementado executava o código… Claro que mesmo com os plugins haverá dependência de chamadas diretas, isso acho que é até inevitável.
Mas mesmo assim, é bom saber que na prática você tentou e não deu muito certo. Isso significa que teremos que pensar em cada detalhe antes de desenvolver algo modularizado desta maneira.
Comentário por Juan Basso — 13 outubro 2008 @ 6:40 pm
Juan: A questão das callbacks seria uma forma mais simples – eu diria relaxada, mas sem ser arrogante, na boa – de implementar Observer (Listener para quem veio do Flash) no aplicativo, o que, se bem estruturado não seria uma má idéia, mas o que acaba acontecendo é que na intenção de não ter intervenção direta no código do aplicativo tu vai acabar a)gerando dependência de configuração para saber quando “carregar os plugins” que serão usados nas callbacks/resposta dos eventos ou b)um mega overhead carregando (quase) todos os plugins em todas as ações – e essa eu já presenciei. Claro que são tudo idéias, mas como eu prefiro “stick to the core”, implementações de workarounds não são muito bem vindas para mim.
Fora do tópico, comecei a acompanhar um pouco de material brasileiro relativo ao cake e percebi que você é bem envolvido em vários projetos, bem legal, parabéns ai.
Comentário por rafaelbandeira3 — 14 outubro 2008 @ 3:38 pm
Realmente muito interessante seu ponto de vista. Vou pensar um pouco melhor antes de começar a desenvolver desta maneira.
Quanto aos projetos, eu gosto de participar sim. As vezes me falta tempo, mas na medida do possível sempre ajudo no que posso. Obrigado pelos elogios.
Comentário por Juan Basso — 14 outubro 2008 @ 6:24 pm