Executar funções de um controller dentro de outro controller

11 de dezembro de 2012, em Tira Dúvidas, por

No CodeIgniter, é possível chamar um controller dentro de outro controller? Com base na estrutura MVC do CI e do que ele permite que façamos, tal façanha é possível e, se sim, seria “condenável”? Tal dúvida surgiu numa troca particular de e-mails mas, a bem da verdade, é uma dúvida bastante comum, principalmente para quem está dando seus primeiros passos no melhor framework PHP.

Um controller dentro de outro

Falando diretamente, (por padrão) não é possível chamar um controller ou funções de um controller dentro de outro no CodeIgniter.

Mesmo que fosse possível, é importante para quem está desenvolvendo o código, antes de tomar esta decisão e começar a trilhar este caminho, repensar se sua lógica e/ou organização do projeto realmente não poderia estar melhor. Se há a necessidade de chamar um controller dentro de outros, isso pode ser um forte sinal de que, na verdade, o que se está precisando é de uma biblioteca!

É muito mais simples, tanto em termos de organização de código, quanto em “termos de raciocínio”, colocar funções que são comuns em vários controllers do código dentro de uma biblioteca (ou, dependendo do caso, um helper).

Entretanto, seja por motivo de necessidade – pois pode existir a necessidade de, somente em situações bem específicas, ser preciso chamar funções de um controller dentro de outro controller – ou por qualquer outro motivo, caso seja preciso chamar um controller ou funções de um controller em outro(s), é possível!

Soluções para chamar funções de um controller em outro

Existem algumas possibilidades de executar funções de um controller em outro no CodeIgniter, dentre as quais:

Bibliotecas

Como citado, uma das soluções é criar uma biblioteca para funções comuns dentro do projeto. Dessa maneira, seja lá em qual controller se estiver, será possível chamar um set de funções comuns que podem estar numa library ou, dependendo das necessidades do projeto (ou das funções que sejam necessárias), dentro de um helper.

As bibliotecas foram criadas, justamente, para esse fim, não é verdade?

Soluções “mirabolantes”

Também é possível conseguir isso através de “funções mirabolantes” (eufemismo para POG). Por exemplo, dentro de uma dúvida no Stack Overflow, perguntando, exatamente, sobre a possibilidade de chamar um controller dentro de outro com CI, uma solução nativa bastante esperta e que funciona foi apresentada (mas de praticidade duvidosa).

Ela envolve ter que passar por referência o super objeto CodeIgniter, muito Paamayim e uma boa dose de codificação extra. Ela é funcional? Sim, ela resolve o problema, mas, se é a melhor solução possível, aí já não há garantias…

Soluções de terceiros

Também é possível buscar a resolução do problema procurando em recursos terceirizados. Por exemplo, a já citada biblioteca Modular Extensions, que permite trabalhar com HMVC no CodeIgniter, pode ajudar bastante nessa questão.

Como, a partir de sua instalação, o fluxo de trabalho MVC é substituído por HMVC, então é possível que os diferentes módulos usados no projeto “conversem” entre si, inclusive com a possibilidade de, de maneira simples, chamar funções de um controller dentro de outro!

Como consta na própria documentação oficial da Modular Extensions, é possível acesso a recursos de diferentes módulos através da sintaxe:

1
modules::run('module/controller/method', $params, $...);

Ou seja, dentro de qualquer controller você pode, através de modules::run, ter acesso a recursos de controllers de outros métodos, simplesmente indicando o que vai querer – e de maneira muito rápida e simples, diga-se de passagem.

Conclusão

Respondendo à pergunta inicial: sim, é possível chamar funções de um controller dentro de outro. E existem diversas maneira de se fazer isso.

Algumas dessas maneiras foram abordadas neste artigo e, como sempre, a melhor solução é a melhor solução para você! Todas são válidas e resolverão o problema, portanto, você deve escolher a que mais se adapta ao contexto do projeto e tem a ver com seu estilo pessoal de programação.

Pessoalmente, ficaria com a última e usaria HMVC que, além de resolver o problema inicial, trás outros benefícios, já explicados no artigo sobre como usar HMVC no CodeIgniter.

Faça sua escolha.

5 comentários em "Executar funções de um controller dentro de outro controller"

gravatar

Rodrigo Sousa  em 16 de fevereiro de 2013

Olá Tárcio Zemel, estou com um probleminha, se você pudesse ajudar, agradeço, estou desenvolvendo um sistema que necessita estar disponível em 3 linguas, para fazer este módulo, estou pensando em criar um helper personalizado, com uma função que inclua arquivos com arrays, que por sua vez contenham as traduções, entretanto, esta função deve tornar as arrays disponíveis globalmente no sistema em todas views e controllers, e ai está o problema, não consigo fazer esta array global, tem como? Obrigado.

gravatar

Tárcio Zemel  em 16 de fevereiro de 2013

Opa, Rodrigo! Antes de optar por essa decisão, saiba que existem diversas soluções prontas para i18n.

Inclusive, há uma classe nativa que, dependendo das necessidades do projeto, pode dar conta: http://ellislab.com/codeigniter/user-guide/librar

gravatar

Carlos Eduardo  em 8 de março de 2013

Olá Tárcio, tudo bom? Então fera, eu me deparei com essa questão no meu projeto a dias atrás, estou criando algo que tenha uma estrutura mais modificável, trata-se de um projeto open em que o usuário poderá instalar módulos sozinhos e chamar em qual "page" necessitar. Então me deparei com essa questão, sem querer através deste blog mesmo descobri o método HMVC, pois bem, fui e aceitei a missão. E obtive êxito, e agora este post para complementar minha dúvida foi ótimo. Obrigado fera!

gravatar

Tárcio Zemel  em 13 de março de 2013

Que é isso, Carlos… O objetivo é esse, mesmo! Quando liberar o projeto na web, coloca o link pra gente dar uma olhada!

gravatar

Alex  em 4 de fevereiro de 2014

Você enrola demais para dizer as coisas, muito massante ler o que vocês escreve, acho que poderia ser um pouco mais direto, não precisa mudar muito, talvez faça parte de sua de sua personalidade na escrita.

    Comente!