Continuando com nossa série sobre o framework CodeIgniter, hoje falaremos sobre os Controllers, que são as classes responsáveis por controlar o fluxo de informações dentro de nossa aplicação.
Depois de acompanhar esse post você estará apto a criar e organizar os seus próprios controllers e actions no CI.
Para começar, é bom ressaltar que devemos sempre criar nossas classes de controle dentro do diretório controllers da pasta da nossa aplicação (application). De forma nativa o CI já vem com o controller welcome.php criado. É ele que nos dá uma mensagem de boas-vindas quando ainda não implementamos nada em nossa app.
O que é um Controller?
Controller é representado pela letra “C” na sigla MVC. É o responsável por controlar quais e como as informações serão apresentadas para o usuário. Imagine a seguinte URL
www.seusite.com/noticias
Nesse exemplo, o CI procura o arquivo noticias.php dentro da pasta controllers e executa o que estiver implementado nele.
Criando nosso primeiro controller
Crie dentro da pasta controllers um arquivo chamado noticias.php. E nesse arquivo implemente o seguinte código.
1 2 3 4 5 6 7 8 9 10 | <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class Noticias extends CI_Controller { public function index() { echo 'Bem vindo a pagina de Noticias'; } } /* End of file noticias.php */ /* Location: ./application/controllers/noticias.php */ |
O CI recomenda que criemos o nome do arquivo controller com letras minúsculas (noticias.php) e a classe com o mesmo nome porém com a primeira letra maiúscula (Noticias). Quando o segundo parâmetro da URL (action) não é informado o CI executará método index().
Outra observação importante é ressaltar que todos os nossos controllers devem extender a classe nativa CI_Controller.
Agora vamos criar outro método(action) dentro do nosso controller.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class Noticias extends CI_Controller { public function index() { echo 'Bem vindo a pagina de Noticias'; } public function esportes() { echo 'Noticias de Esportes'; } } /* End of file noticias.php */ /* Location: ./application/controllers/noticias.php */ |
Quando a URL www.seusite.com/noticias/esportes for executada o CI buscará o controller Noticias e executará o método esportes(), exibindo assim as notícias relacionadas à esse tema.
Como vimos no último post (https://www.rafaelwendel.com/2013/01/codeigniter-url-s/), é possível trabalhar com parâmetros nos métodos (actions) dos controllers. Vamos implementar o método ler($id) onde a partir do codigo será buscado a notícia correspondente.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class Noticias extends CI_Controller { public function index() { echo 'Bem vindo a pagina de Noticias'; } public function esportes() { /* Carrega as noticias de esportes */ echo 'Noticias de Esportes'; } public function ler($id) { /* Busca a notícia referente ao código informado na var $id */ echo 'Noticias de codigo ' . $id; } } /* End of file noticias.php */ /* Location: ./application/controllers/noticias.php */ |
Assim, a URL www.seusite.com/noticias/ler/1
Fique à vontade para implementar quantos parâmetros forem necessários.
Alterando o Controller default
No primeiro post verificamos que por padrão o controller welcome é chamado quando a app é executada. Mas isso pode ser alterado. Abra o arquivo application/config/routes.php e altere o $route[‘default_controller’] para o controller noticias que acabamos de criar.
41 | $route['default_controller'] = "Noticias"; |
Execute seu projeto e se tudo estiver certo você vai verificar que o controller que implementamos já está sendo mostrado como página principal do projeto. Execute também os outros métodos criados. (Lembrando que no meu caso o projeto está hospedado em localhost/ci/)
Pagina de notícias: http:// localhost/ci ou http://localhost/ci/noticias
Página de esportes: http://localhost/ci/noticias/esportes
Página de única notícia: http://localhost/ci/noticias/ler/1
No próximo capítulo veremos como criar rotas personalizadas para nossos controllers.
Abs!
Confira todos os posts da série CodeIgniter Framework
- Introdução ao CodeIgniter Framework
- CodeIgniter – URLs
- CodeIgniter – Controllers
- CodeIgniter – Rotas
- CodeIgniter – Views
- CodeIgniter – Models (Parte I)
- CodeIgniter – Models (Parte II)
- CodeIgniter – Models (Parte III) – Consultas Complexas
Opa, tudo bom Rafael? Ótimo conteúdo, vim aqui através da google e sanei minha dúvida!
Abraços!
otimo post
Valeu pelo post! Está muito bom
Mas funcionou http:// localhost/ci
Esse não http://localhost/ci/noticias
O que pode ser?
Jr,
Aparece algum erro? Colocou o arquivo .htaccess implementado de forma correta? A reescrita de URLs está habilitada para o seu servidor?
Abs!
Brother gostei muito do tutorial, me ajudou bastante a esclarecer muitas dúvidas, porém tive um pequeno problema, os dados não foram inseridos no meu banco, não fiz nenhuma alteração no código a não ser da conexão do banco. Usei o método get pra saber se as variáveis estavam recebendo os valores, e sim estavam mas não inseriu e não consegui resolver. Inserir 1 registro pelo banco mesmo para listar o produto mas aconteceu o seguinte erro:
A PHP Error was encountered
Severity: Notice
Message: Undefined variable: produtos
Filename: views/listar_produtos.php
Line Number: 9
Backtrace:
File: C:\xampp1\htdocs\CodeIgniter\application\views\listar_produtos.php
Line: 9
Function: _error_handler
File: C:\xampp1\htdocs\CodeIgniter\application\controllers\usuario.php
Line: 10
Function: view
File: C:\xampp1\htdocs\CodeIgniter\index.php
Line: 292
Function: require_once
Não consegui resolver também, sou iniciante com MVC e to com algumas dificuldade de entender o conceito pois explicam de maneira muito abstrata pra mim, de qualquer maneira agradeço pois esse tutorial me ajudou bastante!
Olá Junior,
Pelo que me parece, você tentou chamar uma variável “produtos” que não existe. Você passou essa var do controller pra view?
Abs!
Olá,
Tem como uma controller instanciar outra controller? sem que seja por meio de herança.