Successfully reported this slideshow.

PHP 10 CodeIgniter

3,121 views

Published on

Published in: Technology, Business

PHP 10 CodeIgniter

  1. 1. Programação para WEB Regis Pires Magalhães regismagalhaes@ufc.br O Framework CodeIgniter
  2. 2. Framework Oferece uma arquitetura que pode ser usada em várias aplicações. Toda aplicação tem um conjunto de características básicas em comum, que terminam sendo copiadas para a criação de novos códigos. Um framework é projetado para prover uma estrutura para esses elementos comuns.
  3. 3. Frameworks PHP http://www.google.com.br/trends/
  4. 4. Frameworks PHP http://www.google.com.br/trends/
  5. 5. Frameworks PHP http://www.zfort.com/blog/top-5-php-frameworks-infographic/
  6. 6. Frameworks PHP http://www.zfort.com/blog/top-5-php-frameworks-infographic/
  7. 7. Frameworks PHP http://www.linkedin.com/groups/What-is-best-PHP-Framework-78637.S.207852116
  8. 8. Histórico Criado por Rick Ellis que é CEO da empresa EllisLab. Foi escrito com foco em performance de aplicações reais, com muitas bibliotecas de classes, helpers e subsistemas emprestados do código-base do CMS ExpressionEngine. Atualmente é desenvolvido e mantido pela equipe de desenvolvimento do ExpressionEngine. Inspirado e grato ao Ruby on Rails por popularizar o uso de frameworks na Web.
  9. 9. Características Compatível com PHP 5.1.6 ou superior; Leve e não ocupa muito espaço Versão 2.1.4 (08 / 07 / 2013): 2,19 MB compactado, incluindo a documentação 1,29 MB descompactado e sem a documentação Excelente perfomance entre os frameworks PHP; Quase nenhuma configuração; Não exige uso da linha de comando; Bastante flexível; Simples e de rápido aprendizado; Documentação clara e completa, inclusive em português.
  10. 10. Características Bancos de dados suportados: MySQL (4.1 ou superior), MySQLi, MS SQL, Postgres, Oracle, SQLite e ODBC. Software Livre sob uma licença de código aberto no estilo da Apache/BSD. O sistema básico é enxuto e bem rápido. Bibliotecas adicionais só são carregadas dinamicamente sob demanda. Usa a abordagem MVC, que permite ótima separação entre a lógica a apresentação.
  11. 11. Características Usa URLs limpas e amigáveis baseada em segmentos; Vem com vasta biblioteca para desenvolvimento web: acesso a um banco de dados, envio de e-mail, validação de dados, controle de sessões, manipulação de imagens, etc. Tem uma grande comunidade de usuários.
  12. 12. Visão Geral É um framework Web É software livre (licença Apache/BSD) Leve, pequeno e rápido Usa abordagem MVC Permite o uso de URLs limpas Ex: example.com/news/article/345 Já vem com bibliotecas para permitir acesso a banco de dados, envio de email, validação de dados, manipulação de sessão, manipulação de imagens, ... Facilmente extensível. Não requer “template engine”, embora venha com uma simples. É bem documentado, inclusive o código fonte. Comunidade grande e ativa.
  13. 13. Recursos nativos Calendários. Fácil criação de calendários, inclusive com criação de templates de formatação e exibição. Bancos de dados. De maneira simples e rápida é possível: carregar databases, executar querys, manipular resultados de consultas, realizar transações (como se fosse PDO), fazer query caching, dentre outros. E-mails. Enviar e-mails em protocolos diferentes (Mail, Sendmail e SMTP), envio de cópias e cópias ocultas, e-mail em texto puro ou HTML, enviar e- mail com anexos, ferramenta própria para debug, dentre outros. Criptografia. Funções gerais de criptografia, através do uso de hashings e chaves. Formulários. Criação de tags de formulário “on the fly“, tratamento de campos e informações, upload de arquivos, etc. Manipulação de imagens. Redimensionar, criar miniaturas, rotacionar, cortar e inserir marca d’água.
  14. 14. Recursos nativos FTP. Funções gerais de FTP, como mover, renomear, deletar, etc; e ainda uma função especial de espelhagem (”mirroring“), que permite criação dinâmica de diretórios no servidor a partir de arquivos na máquina local. Compactação de arquivos. Manipulação, criação, controle e edição de arquivos compactados, sendo possível criar arquivos diretamente no servidor, acrescentar files diretamente e fazer downloads dos mesmos. Controle de cookies sessões PHP. Manipulação e controle geral de cookies e sessões PHP, com todas suas funções, capacidades e potencialidades existentes. Muitas outras funcionalidades.
  15. 15. Arquitetura MVC
  16. 16. Arquitetura MVC
  17. 17. Arquitetura MVC
  18. 18. Arquitetura MVC Modelos para toda a interação com banco de dados; Visões para todas as apresentações e saídas; Controladores para processar a requisição HTTP e gerar a página web. Serve de intermediário entre o modelo e a visão.
  19. 19. MVC – Vantagens Tarefas repetitivas podem ser separadas, facilitando a manutenção, entendimento, alterações, descoberta de erros e bugs, divisão de tarefas, etc.
  20. 20. Instalação Baixe o CodeIgniter em: http://codeigniter.com/download.php Descompacte-o na pasta htdocs/www e renomeie o diretório para o nome mais adequado para sua aplicação. Abra o arquivo application/config/config.php em um editor de textos e altere a sua URL base. Para usar banco de dados, abra o arquivo application/config/database.php em um editor de textos e altere as configurações do seu banco.
  21. 21. Estrutura de Diretórios internos ao diretório system application – nossa aplicação fica aqui. cache – arquivos em cache. codeigniter – o framework fica aqui. database – componentes para acesso à banco de dados. fonts – helpers – classes auxiliares language – libraries – bibliotecas do CodeIgniter logs – arquivos de log plugins – extensões de terceiros
  22. 22. Estrutura de Diretórios No diretório application temos : config: Arquivos de configuração controllers: controladores errors: helpers: classes auxiliares, utilitárias, etc. hooks: language: libraries: bibliotecas personalizadas models: modelos views: visões
  23. 23. Material em português Guia do usuário (versão antiga em português): http://www.plasmadesign.com.br/codeigniter/user_guide-pt_BR/ Artigos e tutoriais http://codeigniterbrasil.com/ Vídeos (screencasts): Curso de CodeIgniter para iniciantes https://www.youtube.com/playlist?list=PLInBAd9OZCzz2vtRFDwum0OyUmJg8UqDV #DevCast - 07 - Introdução ao CodeIgniter https://www.youtube.com/watch?v=toLEaCbaglc
  24. 24. Fluxo do CodeIgniter 1. O index.php serve como controlador primário, iniciando os recursos básicos. 2. O roteador examina a requisição HTTP para determinar o que deve ser feito com ela. 3. Se já existe o arquivo em cache, ele é devolvido diretamente ao browser. 4. Antes do controller ser carregado, a requisição HTTP e qualquer dado submetido pelo usuário é filtrado por segurança. 5. O Controller carrega o Model, as bibliotecas principais, plugins, assistentes e qualquer outro recurso necessário para processar a requisição. 6. A View finalizada é gerada e enviada ao browser. Se o cache está habilitado, a view é gravada no cache para que seja servida em requisições subseqüentes.
  25. 25. MVC Modelos são normalmente usados, mas não são obrigatórios no CodeIgniter.
  26. 26. Projeto e arquitetura Objetivos principais: máximo desempenho, capacidade e flexibilidade empacotado da forma mais leve e menor possível. Objetivos arquiteturais: Instanciação dinâmica Componentes só são carregados quando requisitados. Baixo acoplamento Independência entre os componentes para maior reuso e flexibilidade. Singularidade dos componentes Componentes com propósito único e bem definido.
  27. 27. URLs amigáveis URLs são projetadas para serem amigáveis aos motores de busca e ao ser humano. No lugar de usar a abordagem padrão "query string", o Code Igniter usa a abordagem baseada em segmentos: www.seu-site.com/noticias/artigos/meu_artigo
  28. 28. URLs amigáveis Os seguimentos da URL geralmente representam: www.seu-site.com/classe/metodo/id O primeiro segmento representa a classe controller que será invocada. O segundo segmento representa o método da classe que será executado. O terceiro, e qualquer outro subseqüente, representa o ID ou qualquer outra variável que serão passados como parâmetros para o controller.
  29. 29. Removendo o index.php da URL Por padrão, index.php será incluso nas URLs: www.seu-site.com/index.php/noticias/artigos/meu_artigo Para evitar seu uso, basta criar algumas regras de reescrita de URL no arquivo .htaccess: Para as URLs geradas pelo CodeIgniter não incluirem o index.php, altere o arquivo de configuração para: RewriteEngine on RewriteCond $1 !^(index.php|img|css|js|robots.txt) RewriteRule ^(.*)$ index.php/$1 [L] $config['index_page'] = '';
  30. 30. Hello World! <?php class Hello extends CI_Controller { function index() { echo "Hello World!"; } } ?> system/application/controllers/hello.php index é a ação padrão de um controller. Se nenhuma ação for explicitamente especificada, index será a ação usada.
  31. 31. Hello World! <?php class Hello extends Controller { function index() { $this->load->view('hello/index'); } } ?> <html> <head><title>Hello</title></head> <body> <p>Hello World!</p> </body> </html> system/application/views/hello/index.php system/application/controllers/hello.php
  32. 32. Visões dentro de pastas Uma boa prática consiste em armazenar as visões dentro de pastas: Uma sugestão é que o nome da pasta seja o nome do controlador e o nome do arquivo seja o nome da ação. $this->load->view('folder_name/file_name'); $this->load->view('hello/index');
  33. 33. Controller sem model <?php class Pessoa extends CI_Controller { function index() { $dados['nome'] = 'João'; $dados['fone'] = '3323-1234'; $this->load->view('pessoa/index', $dados); } } ?> <html> <head><title>Pessoa</title></head> <body> <h1>Pessoa</h1> <p>Nome: <?= $nome ?></p> <p>Telefone: <?= $fone ?></p> </body> </html> system/application/controllers/pessoa.php system/application/views/pessoa/index.php
  34. 34. Configurações $db['default']['hostname'] = 'localhost'; $db['default']['username'] = 'root'; $db['default']['password'] = ''; $db['default']['database'] = 'prog_web'; $db['default']['dbdriver'] = 'mysql'; $config['base_url'] = ''; config/database.php config/config.php $route['default_controller'] = 'hello'; config/routes.php
  35. 35. Diferentes formas de usar links através do CodeIgniter <?php $this->load->helper('url'); ?> <!DOCTYPE html> <html> <head> <title>Hello</title> </head> <body> <h1>Hello World!!!</h1> <p>Agora na Visão</p> <p>Nome: <?= $nome ?></p> <p><a href="<?= site_url('hello/acao')?>"> Ir para hello-acao usando site_url</a></p> <p><a href="<?= base_url('hello/acao')?>"> Ir para hello-acao usando base_url</a></p> <p><?= anchor('hello/acao', 'Ir para hello-acao usando anchor') ?></p> </body> </html> Vamos dar preferência ao uso de site_url
  36. 36. site_url() x base_url() site_url() index.php ou qualquer outra coisa definida como index_page no arquivo de configuração será adicionado à URL. O url_suffix definido no arquivo de configuração também será adicionado. Recomenda-se o uso desta função para gerar URLs mais portáveis entre diferentes hosts e diretórios onde a aplicação esteja localizada. Jamais use URLs absolutas para referenciar recursos da própria aplicação.
  37. 37. Carregamento automático de helpers application/config/autoload.php $autoload['helper'] = array('url', 'file'); $autoload['helper'] = array('url'); Ou carregando mais de um helper....
  38. 38. Onde colocar imagens, css e js? Pode-se criar as pastas a seguir na raiz do projeto (não é na raiz da aplicação, ou seja, deve estar no mesmo nível, mas não dentro na pasta application): img css js E armazenar os seus arquivos nelas. Não é obrigado usar esse nomes de pastas, mas é um bom padrão. Essas pastas devem ser definidas nas regras do .htaccess para uma reescrita de URL correta. RewriteEngine on RewriteCond $1 !^(index.php|img|css|js|robots.txt) RewriteRule ^(.*)$ index.php/$1 [L]
  39. 39. Reduzindo o tamanho da aplicação Apague o diretório user_guide de seu projeto. Como ele ocupa bastante espaço, recomenda-se que ele seja eliminado de suas aplicações.
  40. 40. Modelo <?php class Pessoa extends CI_Model { private $nome, $fone; function setNome($nome) { $this->nome = $nome; } function setFone($fone) { $this->fone = $fone; } function getNome() { return $this->nome; } function getFone() { return $this->fone; } } ?> system/application/models/pessoa.php
  41. 41. Controller usando model <?php class Pessoa extends CI_Controller { function index() { $this->load->model('pessoa'); $p = new Pessoa(); $p->setNome('João'); $p->setFone('3323-1234'); $dados['pessoa'] = $p; $this->load->view('pessoa/index', $dados); } } ?> system/application/controllers/pessoa.php
  42. 42. View usando model <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <title>Pessoa</title> </head> <body> <h1>Pessoa</h1> <p>Nome: <?= $pessoa->getNome(); ?></p> <p>Telefone: <?= $pessoa->getFone(); ?></p> </body> </html> system/application/views/pessoa/index.php
  43. 43. Compartilhando um layout <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>CI - Exemplo Layout</title> </head> <body> <?= $this->load->view($view) ?> </body> </html> system/application/views/layout.php
  44. 44. Compartilhando um layout <?php class Pessoa extends CI_Controller { function index() { $this->load->model('pessoa_model'); $p = new Pessoa_Model(); $p->setNome('João'); $p->setFone('3323-1234'); $dados['pessoa'] = $p; $dados['view'] = 'pessoa/mostra'; $this->load->view('layout',$dados); } } ?> system/application/controllers/pessoa.php
  45. 45. Conteúdo do layout <h1>Pessoa</h1> <p>Nome: <?= $pessoa->getNome(); ?></p> <p>Telefone: <?= $pessoa->getFone(); ?></p> system/application/views/pessoa/mostra.php
  46. 46. Segurança – Filtro XSS $config['global_xss_filtering'] = TRUE; application/config/config.php XSS - cross-site scripting.
  47. 47. Paginação As configurações de paginação podem ser compartilhadas por toda a aplicação se armazenadas no arquivo config/pagination.php. Este arquivo não existe por padrão e, portanto, precisa ser criado.
  48. 48. Paginação usando BD <?php class Pessoas extends CI_Controller { function index($inicio=0) { $num_linhas_pag = 2; // Obtém parâmetros do formulário de busca $param = $this->input->post(); // Obtém dados do modelo $this->load->model('Pessoa'); $tot_linhas = $this->Pessoa->conta($param['texto']); $dados['pessoas'] = $this->Pessoa->busca($param['texto'], $num_linhas_pag, $inicio); // Configura a paginação $this->load->library('pagination'); // Ver também arquivo config/pagination $config['base_url'] = site_url('/pessoas/index'); $config['total_rows'] = $tot_linhas; $config['per_page'] = $num_linhas_pag; $this->pagination->initialize($config); $dados['texto'] = $param['texto']; $dados['visao'] = 'pessoas/index'; $this->load->view('layout', $dados); } ... ?>
  49. 49. Paginação usando BD <?php class Pessoa extends CI_Model { function Pessoa() { $this->load->database(); } function conta($texto) { $this->db->like('nome', $texto); $this->db->or_like('fone', $texto); return $this->db->count_all_results('pessoas'); } function busca($texto,$qtd,$inicio) { $this->db->like('nome', $texto); $this->db->or_like('fone', $texto); $this->db->limit($qtd, $inicio); return $this->db->get('pessoas')->result(); } ... ?>
  50. 50. Sessão $this->load->library('session'); Dados de sessão no CI são armazenados em um array: [array] ( 'session_id' => random hash, 'ip_address' => 'string - user IP address', 'user_agent' => 'string - user agent data', 'last_activity' => timestamp ) In order to use the Session class you are required to set an encryption key in your config file.
  51. 51. Sessão – obtenção de dados $this->session->userdata('item'); $session_id = $this->session->userdata('session_id');
  52. 52. Sessão – inserção de dados $this->session->set_userdata($array); $newdata = array( 'username' => 'johndoe', 'email' => 'johndoe@some-site.com', 'logged_in' => TRUE ); $this->session->set_userdata($newdata); $this->session->set_userdata('some_name', 'some_value');
  53. 53. Sessão – inserção de dados $this->session->set_userdata($array); $newdata = array( 'username' => 'johndoe', 'email' => 'johndoe@some-site.com', 'logged_in' => TRUE ); $this->session->set_userdata($newdata); $this->session->set_userdata('some_name', 'some_value');
  54. 54. Sessão – obtenção de todos os dados $this->session->all_userdata()
  55. 55. Sessão – remoção de dados $this->session->unset_userdata('some_name'); $array_items = array('username' => '', 'email' => ''); $this->session->unset_userdata($array_items); $this->session->sess_destroy();
  56. 56. Flashdata $this->session->set_flashdata('item', 'value'); $this->session->flashdata('item'); $this->session->keep_flashdata('item');
  57. 57. Herdando de um controller seu $config['subclass_prefix'] = 'MY_'; class MY_Controller extends CI_Controller { // código } /application/core/MY_Controller.php /application/config/config.php class Usuarios extends MY_Controller { // código } /application/controller/Usuarios.php
  58. 58. Validação ... $this->load->library('form_validation'); $this->form_validation->set_rules('usuario', 'Usuario', 'required|is_unique[aluno.usuario]|max_length[20]'); $this->form_validation->set_rules('senha', 'Senha', 'required|max_length[10]'); $this->form_validation->set_rules('email', 'Email', 'required|is_unique[aluno.email]|max_length[50]'); $this->form_validation->set_message('max_lenght', 'Número de caracteres ultrapassado.'); $this->form_validation->set_message('is_unique', 'O email/usuario já existe.'); if ($this->form_validation->run() == TRUE){ ... } else { ... } ...
  59. 59. Associações
  60. 60. Rotas
  61. 61. Helpers
  62. 62. Logging
  63. 63. Co
  64. 64. Referências http://ellislab.com/codeigniter Doctrine http://www.doctrine-project.org/ https://github.com/doctrine/doctrine2

×