Estrutura de diretórios: organização de pastas do CodeIgniter 2

21 de março de 2011, em Passos Iniciais, por

Estrutura de diretórios do CodeIgniter 2

Estrutura de diretórios do CodeIgniter 2

Não dá pra trabalhar com o CodeIgniter sem conhecer sua estrutura de diretórios. É conhecendo como é a organização das pastas no CodeIgniter e sabendo sua função dentro do “todo” do framework que é possível mexer no CI com eficiência e consciência – também é importantíssimo conhecer o Fluxograma de Dados do CodeIgniter (se ainda não leu o artigo, leia antes de continuar).

Com um pouco mais de experiência é possível alterar a estrutura de diretórios do CodeIgniter, mas, para fins didáticos, será mostrada no tutorial a estrutura padrão de pastas do CodeIgniter 2.

Não serão detalhadas as funções/possibilidades completas de cada pasta e seus respectivos arquivos; isso será feito, com o tempo, na medida em que novos artigos são publicados no blog. Portanto, não é preciso ficar frustrado caso encontre termos que ainda desconhece; assine o feed do CodeIgniter Brasil para não perder as atualizações.  ;-)

Visão geral da estrutura de pastas do CodeIgniter 2

Como pode ser visto na imagem da estrutura de pastas acima, na raiz da estrutura do CodeIgniter existem 3 diretórios e 2 arquivos.

Diretórios

Os 3 diretórios existentes na raiz da estrutura do CodeIgniter são:

  • application. Pasta onde os arquivos do aplicativo desenvolvido ficam. Praticamente toda a codificação em CI fica nesta pasta, que abriga seus models, views, controllers e outros que ainda serão tratados no blog.
  • system. Local destinado aos arquivos que fazem o CodeIgniter o que é; são os arquivos do core. Geralmente, não devem ser mexidos.
  • user_guide. Contém o Guia do Usuário (User Guide) do CodeIgniter (cópia da documentação online).

Arquivos

Juntamente com os diretórios supracitados, na raiz do esquema de diretórios do CodeIgniter existem 2 arquivos:

  • index.php. Primordial para o funcionamento do CI, contém informações para se alterar o nível de error reporting que se vai trabalhar; opcionalmente, também é possível alterar os nomes padrão da pasta “system” e “application” (mais a respeito: Instalação e configuração inicial do CodeIgniter), dentre outras muitas configurações
  • licente.txt. É o arquivo com a licença do CI que, como já foi tratado no artigo sobre requisitos de servidor e licença de uso, deve constar em todo software/aplicativo feito em CodeIgniter.

application

Sem dúvidas, a pasta application é a mais importante para o desenvolvimento dos aplicativos e é a que mais vai exigir sua atenção/codificação. Já que todo seu trabalho vai ser aqui, é importante conhecer bem a estrutura de subdiretórios da pasta “application”:

  • cache. Pasta usada quando se está usando caching no CodeIgniter. É aqui que as páginas cacheadas ficam armazenadas e são servidas.
  • config. Contém diversos (e importantes) arquivos relacionados a configurações de seu CI. São arquivos de configuração de database, variáveis sobre URL, quais libraries e helpers serão carregados automaticamente e muitas outras coisas.
  • controllers. Armazena os controllers que você cria para o seu software.
  • core. Pasta criada no CI 2 para conter algumas bibliotecas consideradas mais “core” que outras. Não é usada em todos os projetos.
  • errors. Vem com os templates de páginas de erros do CodeIgniter (erros genéricos, 404, conexão ao banco de dados, etc). É conveniente que tudo isso seja alterado para que os erros do aplicativo fiquem personalizados e consonantes com a finalidade deste.
  • helpers. Para armazenar todos os helpers que você venha a criar/aprimorar.
  • hooks. Para colocar os hooks que você cria. Em artigos futuros será mostrado que hooks são a maneira mais rápida e segura de você extender o core do CodeIgniter (geralmente feito por usuários avançados).
  • language. Para aplicativos multi-idioma, esta pasta é bem usada por armazenar as mensagens nas diferentes escritas.
  • libraries. Aqui ficam as libraries personalizadas, com funcionalidades para o programa a ser criado. Perceba que há diferença entre as pastas system/libraries e system/application/libraries.
  • logs. Quando se habilita o salvamento de logs em arquivo em /application/config/config.php, é nesta pasta que eles serão salvos.
  • migrations. Quando se usa acesso externo ao CodeIgniter via linha de comando (CLI), a pasta “migrations” é usada para algumas operações.
  • models. Armazena os models que você cria para seu aplicativo.
  • third_party. É possível distribuir aplicativos inteiros do CodeIgniter de forma fácil, e, para tal, é possível criar estrutura personalizadas nesta pasta, onde constam todos helpers, liberaries, models, etc, destas aplicações.
  • views. Armazena os views que você cria para seu programa.
Todos os seus projetos terão imagens, folhas de estilo, javascript e outros arquivos necessários. Evidentemente será preciso pastas para organizar tudo isso. Existe uma técnica que preconiza que a melhor maneira para organizar isso é fazer pastas na raiz da instalação do CodeIgniter – ou seja, no mesmo nível hierárquico da pasta application. Mas, para se fazer isso, é preciso utilizar um .htaccess com algumas poucas linhas para que o CodeIgniter reconheça as novas pastas:

1
2
3
RewriteEngine on
RewriteCond $1 !^(index\.php|img|css|js)
RewriteRule ^(.*)$ index.php/$1 [L]

Basicamente as instruções fazem com que o CI reconheça as pastas “img”, “css”, “js” e, de quebra, ainda retiram “index.php” do URL (algo que será explicado em um momento mais oportuno).

O importante é a função de cada pasta

Principalmente quando se está começando, é bastante comum ficar em dúvida sobre a função de cada diretório e ter receio de criar arquivos no lugar errado. Estudando a estrutura de pastas do CodeIgniter, certamente esse não será um problema que irá travar seu processo de desenvolvimento.

O CodeIgniter foi projetado para manter seguros seus arquivos de core e é por uma razão que existe uma pasta específica para você criar os arquivos de seu software. Você deve concentrar seus arquivos em “application”, criando arquivos nos diretórios adequados – conforme foi abordado neste artigo – e somente criar/alterar arquivos de “system” caso você saiba exatamente o que está fazendo (e tenha um bom motivo pra isso).

28 comentários em "Estrutura de diretórios: organização de pastas do CodeIgniter 2"

gravatar

Renan Hagiwara  em 25 de março de 2011

Cara, estou começando agora a utilizar frameworks para desenvolvimento e optei pelo CodeIgniter. Este blog foi a melhor referência em Português que encontrei até agora. Posts um tanto frequentes e bem completos. Parabéns e por favor continue com o mesmo ânimo.

Abraço!

gravatar

Tárcio Zemel  em 29 de março de 2011

Muito obrigado, Renan! Com a ajuda da comunidade, certamente o trabalho continuará. Se tiver sugestões, basta dizer.

Abraços!

gravatar

André  em 30 de março de 2011

Ola Tarcio, assim como o amigo acima citou, estou começando agora a pesquisar sobre os frameworks e estou interessadissimo em utilizar o CI para o desenvolvimento de minhas aplicações. Mas uma duvida que me bateu foi a seguinte:

Eu tenho um servidor local com a pasta htdocs, dentro dela tenho varias pastas para os projetos que estou desenvolvendo ou que ja foram desenvolvimentos.

Eu consigo criar por exemplo pastas: projeto1/projeto2 na raiz do meu servidor loccal e dentro delas inserir os arquivos do CI ?

Eu

gravatar

Renan Hagiwara  em 30 de março de 2011

Eu tenho uma sugestão sim, gosto muito de imprimir artigos bons para ler mais de uma vez, sempre tenho um destes a mão quando estou em algum lugar esperando por alguma coisa. ;-P
A minha sugestão então é criar um CSS para impressão, ou sei lá, se existir um plugin do WP para impressão apenas de conteúdo também ajuda. Eu posso até tentar contribuir com a criação do arquivo CSS para impressão. ;-P

Abraço!

gravatar

Tárcio Zemel  em 4 de abril de 2011

Sim, é isso, mesmo.

gravatar

Tárcio Zemel  em 4 de abril de 2011

Legal a sugestão. Vou ver se dou um jeito de fazer uma interação para imprimir os artigos (apesar de eu achar meio estranho ler fora do PC artigos de programação, rsrs).

Obrigado!

gravatar

Tárcio Zemel  em 6 de abril de 2011

Pronto, Renan, agora, ao fim de cada artigo, é possível encontrar o botão para impressão e compartilhamento em redes sociais.

Obrigado pela sugestão!

gravatar

Kadu  em 14 de abril de 2011

Olá Tarcio, assim como em qualquer comentário que faço nesse site não posso deixar de elogiar sempre, parabens mesmo!!
Como nao encontrei nenhum post relacionado a minha duvida estou comentando neste mesmo pois estou com um probleminha que esta tirando meu sono….rs
Eu desenvolvi meu primeiro sistema usando o codeigniter, em localhost foi tudo beleza porem quando joguei no servidor tive uma pequena surpresa, tudo onde tem cadastro, alteração ou exclusão, se bem sucedido eu redireciono para a listagem dos dados, porem quando testei online vi que ao cadastrar algum dado, ele nao aparece na listagem a nao ser que eu de um refresh com f5, como nao estou usando cache nem nada disso, nao sei o que pode estar acontecendo…
Voce saberia alguma solução pra isso ou o que posso estar fazendo de errado para que isso esteja acontecendo…
Parabéns pela força que nos da aqui pelo blog, espero um dia ter conhecimento o bastante para poder ajudar nas respostas aqui tambem…

Abração

gravatar

Renan  em 23 de abril de 2011

Bacana, agora dá pra imprimir numa boa. Eu costumo ler bastante fora do PC (impresso), pois, ainda não tenho tablet nem smartphone. "/ kkkkk

Valeu pela atenção a minha sugestão.

gravatar

Renan Hagiwara  em 4 de maio de 2011

Eu tenho uma dúvida referente a como trabalhar com diretórios no CodeIgniter. Vejam bem, dentro da pasta Controllers eu tenho um home.php, uma pasta /admin e dentro desta pasta eu tenho um admin.php. Para acessar meu controller Admin eu tenho que digitar: http://www.site.com.br/admin/admin/. Existe alguma maneira (que eu imagino seja com rota) para retirar esse primeiro /admin/ da URL?
Obrigado e abraços.

gravatar

Flavio  em 9 de maio de 2011

Olá, existe uma maneira de eu organizar as pastas da view por pasta referenciando os controller?

gravatar

Tárcio Zemel  em 16 de maio de 2011

Se você volta à página da listagem com javascript (usando "history.go(-1)"), então é esse o motivo, porque ele usa uma espécie de cache, sim.

Agora, se não for isso, então é alguma discrepância de configuração entre seu localhost e o server oficial. Confira se todas as variáveis de configuração estão idênticas.

Abraços!

gravatar

Tárcio Zemel  em 16 de maio de 2011

O modo fácil é você renomear esse "admin.php" para "index.php", pois o CI não precisa do segmento de URL da função quando se trata do index.

Agora, se precisar de algo mais específico, indico o artigo que trata sobre configuração de rotas no CodeIgniter.

gravatar

Tárcio Zemel  em 16 de maio de 2011

Não entendi bem sua pergunta, mas dê uma olhadinha no artigo sobre views no CodeIgniter.

gravatar

Flavio  em 16 de maio de 2011

O que eu quis dizer é algo do tipo como no Rails, tenho os controllers, por exemplo, ProdutoController, e as views do metodos ficam em views/produto/nome-do-metodo.extensao

eu consegui fazer algo assim (codigo de cabeca):
$…->load('produto/nome-do-metodo', $array);

gravatar

Tárcio Zemel  em 17 de maio de 2011

No CI não temos essa "trava" de ser obrigado a ter os views com o mesmo nome do controller. Um controller pode chamar quaisquer views necessários.

Dê uma olhadinha no artigo sobre views para ver como. Abraços!

gravatar

Ronildo Souza  em 9 de janeiro de 2012

Valeu pelo post!

gravatar

Tadeu  em 17 de janeiro de 2012

Tárcio, eu quero deixar a minha aplicação mais segura ainda, deixando na raiz somente a pasta view, js e css. Posso fazer isso? De que maneira? Um abraço

gravatar

Daniel  em 24 de janeiro de 2012

Eu resolvi este problema na rota usando o comando:
$route['admin'] = 'admin/admin';
Dentro do controller eu criei uma pasta chamada 'admin' e dentro uma página 'admin.php'… Espero ter ajudado

gravatar

Tárcio Zemel  em 25 de janeiro de 2012

Para as pastas "js" e "css" basta usar o código no .htaccess mostrado no artigo. Agora, para a pasta "view", já é mais complicado (e, sinceramente, não sei como a mudança de local tornaria o aplicativo mais seguro).

Abraços!

gravatar

Renato  em 27 de março de 2012

Oi Tácio, gostaria de criar multiplos templates, ou seja, tudo organizado dentro da pasta views.
views/template1
views/template2

é possível ?

gravatar

André de Pádua  em 14 de maio de 2012

Olá Tárcio.
Gostaria de saber como fazer para deixar uma pasta inacessível pelo navegador, esta pasta é usada para guardar arquivos que são upados no admin.
Atualmente como é projeto de aula deixei no mesmo nível da application. Mas creio que isso não seria seguro.
Eu poderia criar uma pasta dentro da application pra guardar os arquivos dentro dessa pasta? ou tem alguma configuração que proteja esse diretório?
Obrigado!

gravatar

Tárcio Zemel  em 14 de maio de 2012

Sim, é possível. Basta criar nessa estrutura e referenciar no código da maneira correta.

Por exempo: $this->load->view('template1/header.php');

gravatar

Tárcio Zemel  em 14 de maio de 2012

Na verdade, isso já é configuração a nível de servidor. Lá no server você diz que a pasta não é acessível pelo browser.

Para enviar arquivos você poderia, por exemplo, usar a FTP Class.

gravatar

André de Pádua  em 16 de maio de 2012

tá, mas se alguém tentar acessar via url

exemplo: http://localhost/projeto/arquivos/file.pdf

ele teria acesso ao arquivo, o que queria é não poder deixar acessar isso, ou com htaccess já restringiria acesso a pasta arquivos?
no caso quando perguntei era se a pasta arquivos poderia deixar inacessível direto pelo browser mas configurando algo no CI mesmo

e claro, usei localhost ali pra exemplificar, mas imaginamos o problema estando online o projeto
o upload já consigo fazer e tal

Obrigado.

gravatar

Tárcio Zemel  em 16 de maio de 2012

Sim, seria a nível de servidor.

Dê uma olhada em como restringir o acesso direto a arquivos (ou entre em contato com seu host para isso).

Abraços!

Comente!