Upload
regis-magalhaes
View
2.242
Download
0
Embed Size (px)
Citation preview
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.
Frameworks PHPhttp://www.google.com.br/trends/
Frameworks PHPhttp://www.google.com.br/trends/
Frameworks PHP
http://www.zfort.com/blog/top-5-php-frameworks-infographic/
Frameworks PHP
http://www.zfort.com/blog/top-5-php-frameworks-infographic/
Frameworks PHP
http://www.linkedin.com/groups/What-is-best-PHP-Framework-78637.S.207852116
HistóricoCriado 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.
CaracterísticasCompatível com PHP 5.1.6 ou superior;Leve e não ocupa muito espaçoVersão 2.1.4 (08 / 07 / 2013):2,19 MB compactado, incluindo a documentação1,29 MB descompactado e sem a documentaçãoExcelente 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.
CaracterísticasBancos 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.
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.
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.
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.
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.
Arquitetura MVC
Arquitetura MVC
Arquitetura MVC
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.
MVC – Vantagens
Tarefas repetitivas podem ser separadas, facilitando a manutenção, entendimento, alterações, descoberta de erros e bugs, divisão de tarefas, etc.
InstalaçãoBaixe o CodeIgniter em:http://codeigniter.com/download.phpDescompacte-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.
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
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
Material em portuguêsGuia do usuário (versão antiga em português):
http://www.plasmadesign.com.br/codeigniter/user_guide-pt_BR/
Artigos e tutoriaishttp://codeigniterbrasil.com/
Vídeos (screencasts):Curso de CodeIgniter para iniciantes
https://www.youtube.com/playlist?list=PLInBAd9OZCzz2vtRFDwum0OyUmJg8UqDV
#DevCast - 07 - Introdução ao CodeIgniterhttps://www.youtube.com/watch?v=toLEaCbaglc
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.
MVC
Modelos são normalmente usados, mas não são obrigatórios no CodeIgniter.
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.
URLs amigáveisURLs 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
URLs amigáveis
Os seguimentos da URL geralmente representam:
www.seu-site.com/classe/metodo/idO 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.
Removendo o index.php da URLPor 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 onRewriteCond $1 !^(index\.php|img|css|js|robots\.txt)RewriteRule ^(.*)$ index.php/$1 [L]
$config['index_page'] = '';
Hello World!
<?phpclass 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.
Hello World!
<?phpclass 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
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');
Controller sem model
<?phpclass 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
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
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
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.
Carregamento automático de helpers
application/config/autoload.php
$autoload['helper'] = array('url', 'file');
$autoload['helper'] = array('url');
Ou carregando mais de um helper....
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 onRewriteCond $1 !^(index\.php|img|css|js|robots\.txt)RewriteRule ^(.*)$ index.php/$1 [L]
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.
Modelo
<?phpclass 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
Controller usando model
<?phpclass 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
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
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
Compartilhando um layout
<?phpclass 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
Conteúdo do layout
<h1>Pessoa</h1><p>Nome: <?= $pessoa->getNome(); ?></p><p>Telefone: <?= $pessoa->getFone(); ?></p>
system/application/views/pessoa/mostra.php
Segurança – Filtro XSS
$config['global_xss_filtering'] = TRUE;
application/config/config.php
XSS - cross-site scripting.
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.
Paginação usando BD<?phpclass 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); } ...?>
Paginação usando BD<?phpclass 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(); } ...?>
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.
Sessão – obtenção de dados
$this->session->userdata('item');
$session_id = $this->session->userdata('session_id');
Sessão – inserção de dados
$this->session->set_userdata($array);
$newdata = array( 'username' => 'johndoe', 'email' => '[email protected]', 'logged_in' => TRUE );
$this->session->set_userdata($newdata);
$this->session->set_userdata('some_name', 'some_value');
Sessão – inserção de dados
$this->session->set_userdata($array);
$newdata = array( 'username' => 'johndoe', 'email' => '[email protected]', 'logged_in' => TRUE );
$this->session->set_userdata($newdata);
$this->session->set_userdata('some_name', 'some_value');
Sessão – obtenção de todos os dados
$this->session->all_userdata()
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();
Flashdata
$this->session->set_flashdata('item', 'value');
$this->session->flashdata('item');
$this->session->keep_flashdata('item');
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
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 {...}...
Associações
Rotas
Helpers
Logging
Co
Referências
http://ellislab.com/codeigniter Doctrine
http://www.doctrine-project.org/ https://github.com/doctrine/doctrine2