CakePHP – Indrodução ao framework

O que é CakePHP?

CakePHP é um conjunto de scripts e bibliotecas em PHP, OpenSource visando automatizar ações corriqueiras na vida de um programador como CRUD (Create,Read,Update,Delete) de informações usando o modelo MVC.

Como ele trabalha? 

O CakePHP trabalha usando o modelo MVC e com convenção de nomes, ou seja, dentro de uma estrutura MVC cada seção tem uma forma de nomenclatura que veremos a seguir: 

Banco de dados:

Tabelas:

As tabelas devem ser nomeadas no plural seguindo a pluralização da gramática inglesa. Exemplos: users, pages, usuarios, stories. 

Chaves Primárias:

As chaves primárias devem ser nomeadas com "id". Veremos como alterar o id padrão do CakePHP mais adiante.

Chaves Estrangeiras:

As chaves estrangeiras de outras tabelas devem se chamar TabelaSingular_id. Exemplo: Salas possui N Alunos. Na tabela alunos, além da chave primária "id", teremos uma chave estrangeira "sala_id" que referenciará a sala em que o aluno se encontra.

 

MVC:

Model:

Para cada tabela, o CakePHP necessita de uma Model para gerenciar seu conteúdo e esta deve ser nomeada no singular, ou seja,  para uma tabela usuarios a model terá o nome de Usuario.php.

Controller:

Costuma-se ter uma controller para cada model mas podem haver mais. Elas recebem o nome no plural, no caso, UsuariosController.php

View:

As views, interface que o usuário fará interação (forms, inputs de dados) são organizadas dentro de um diretório com nome da Model no plural, no caso Usuarios, e dentro um arquivo com o nome da função dentro da controller, Usuarios/lista.ctp (referenciando a função lista existente dentro da controller Usuarios)

 

URL e fluxo de renderização:

Situação1: O usuário, ainda não cadastrado em nosso sistema, deseja se cadastrar e acessa a url: http://nossodominio.com.br/users/add

Analisando:

Primeira parte, temos o domínio do nosso site http://nossodominio.com.br/, nada de muito especial. Segunda parte, temos users/add, esse nome remete à seguinte estrutura do CakePHP: 

Model: app/Model/User.php

Controller: app/Controller/UsersController.php com chamada para a function add();

View: app/View/Users/add.ctp

ou seja, assim que o usuário acessar essa url o cake seguirá o fluxo: Carregar Model/User.php e Controller/UsersController.php, chamar a function add() e renderizar a view Users/add.ctp.

 

Abaixo a assinatura do método add dentro da UsersController.php

function add(){

### SomeCode ###

}

 

Situação2: O usuário quer editar o post de id=3 já inserido no banco de dados e acessa a url: 

http://nossodominio.com.br/posts/edit/3

Analisando:

Ele fará a mesma coisa da url de usuários com um diferencial; a função edit dentro da PostsController.php espera um parâmetro que é o id do post. Este id é passado na url após o nome da função. 

Abaixo a assinatura do método edit dentro da PostsController.php

 

function edit($id){

### SomeCode ###

}

Conhecendo o básico, veremos como automatizar geração de código através de um modelo de dados SQL usando a Bakery do Cakephp. 

Até breve!

Como criar uma pasta com o PHP

Mais uma vez estava implementando melhorias para a melhor loja nerd da internet e resolvi compartilhar um tutorial básico!

Como criar pasta com PHP?

Estou usando o Code Igniter e fui implementar melhorias no upload de fotos do Eu Compraria, para isso precisava criar diretórios específicos para cada produto.

Para criar uma pasta com o PHP você precisa:

  • PHP instalado (doooh…)
  • Permissão de escrita no pasta onde você vai escrever

O comando é simples, quase o mesmo utilizado em terminal:

mkdir ("/var/www/dominio/media/imagens/eu-compraria-shop", 0755 );

O primeiro parâmetro da função mkdir do PHP é o caminho da pasta que você vai criar, o segundo parâmetro é o código CHMOD de permissões para a pasta que você vai criar, a permissão tem que estar em modo octal (começando com 0).

Fácil, não? 🙂

Utilizando memcache no CodeIgniter

Recentemente passei o And After da versão 1.7 para a versão 2.0.2 do CodeIgniter (CI),  e fiquei feliz com as facilidades do driver de cache na nova versão, recomendo a atualização do framework!

Nas versões anteriores só existia (nativamente) o cache de "output" no CI, isso significa que eu só podia cachear uma "saída" para aquela url (por método de um controller). A performance fica voando, porém isso engessava um pouco o cache, não podia fazer verificações de usuário logado, personalização, executar scripts, etc. Se já existia um cache para determinado controller ele era usado e ponto, não podia contar views, verificar data, exibir informações de acordo com o usuário, etc.

Com o novo driver de cache ficou muito mais fácil, você pode optar entre os seguintes tipos de cache:

  • Dummy – Utilizado apenas para não dar erro em ambiente de desenvolvimento, ele não cacheia nada.
  • File – Cache de arquivo, fica armazenado em /application/cache
  • Memcache – cache de memória utilizando um servidor memcached
  • APC  – Cache APC do PHP

Utilizando o memcache no CodeIgniter

O memcache é um cache de memória, e precisa de um servidor de cache. O primeiro passo é instalar o memcache.

Com o servidor instalado e configurado, você precisa configurar sua aplicação no CodeIgniter para o uso do cache, vamos lá!

Carregando o Driver de cache

A primeira coisa que você precisa é o Driver de Cache carregado:

$this->load->driver('cache');

Com isso você já pode usar os métodos de cache que o driver suporta.

Salvando um objeto de cache

O driver de cache funciona com chave->valor, para salvar um objeto é simples, o método save é chamado com 3 parâmetros nesta ordem:

  1. Chave do objeto
  2. Valor do objeto
  3. "Time to live", tempo em segundos que o cache deve permanecer salvo.

Para salvar o objeto "site" com valor "O Desenvolvedor" por 2 minutos temos o seguinte:

$this->cache->memcached->save('site', 'O Desenvolvedor', 120);

Recuperando um objeto de cache

O método get retorna o valor do objeto se ele existir e false se não existir o objeto em cache:

$site = $this->cache->get('site');

O retorno "false" permite verificação se um objeto existe, por exemplo:

if($this->cache->get('site')){
   //faz alguma coisa pois o cache existe
}else{
   //Faz uma consulta no banco e salva ela no cache
   $this->cache->memcached->save('site', 'O Desenvolvedor', 120);
}

Apagando um objeto do cache

Função delete, bastante intuitiva, só passa como parâmetro a chave do objeto a ser excluído:

$this->cache->delete('site');

 

Com essas informações tudo o que você precisa para melhorar a performance da sua aplicação é um pouco de criatividade e testes, testes e testes. No And After fiz diversos testes, optei pelo uso de file cache para os posts.

Em alguns casos de posts com centenas de comentários o ganho de performance foi muito grande, no post de cartão de visita por exemplo a performance de back-end ficou mais de 10 vezes mais rápida para entrega dos objetos. Agora estou trabalhando no cache do O Desenvolvedor e do Eu Compraria! Shop.

A melhoria de performance e redução de gasto com servidor valem qualquer tempo investido no estudo e aplicação do cache!

Sugestões, críticas e melhorias nos comentários! 🙂

Referências

Instalando e configurando o memcache no Apache

Finalmente consegui resolver o problema de cache do And After, criei um sistema de cache que cacheia partes das páginas dos posts. Como o tutorial de como instalar o NodeJS foi bastante útil para meus colegas aqui no iG, resolvi compartilhar o processo de instalação e configuração do memcached no servidor (Apache rodando no Ubuntu). 

Atenção: o PHP tem duas bibliotecas para trabalhar com memcache: memcache e memcached (veja a diferença entre as duas aqui), este tutorial se refere ao memcached apenas.

 

Instalação dos pacotes necessários

No terminal digite os comandos abaixo para instalar o Memcached e o módulo do PHP para se comunicar com o sistema de cache.

apt-get install php5-dev memcached php-pear php5-memcache

É necessário o php5-dev para execução do comando abaixo, que utiliza PECL (repositório de extensões para o PHP), eu não consegui instalar sem o pacote do php5-dev por isso adicionei ele na lista.

Será necessário fazer o build em um dos pacotes, portanto você precisará ter o pacote abaixo (provavelmente você já tenha ele instalado):

sudo apt-get install build-essential

Agora que você já tem todos os pacotes necessários, vamos para a instalação!

 

Instação do libmemcached

O memcached no PHP tem uma dependência da libmemcached, então precisaremos fazer o build dessa lib que não está no repositório do Ubuntu. No site oficial do memcached baixe a versão que você deseja instalar.

Copie a url e por terminal faça o download (troque a url pela versão que deseja baixar, recomendo a última):

wget http://download.tangent.org/libmemcached-0.37.tar.gz

Descompacte o arquivo que você acabou de baixar (troque o nome do arquivo pela versão que você baixou):

tar -xzf libmemcached-0.37.tar.gz

Acesse a pasta do arquivo descompactado, configure e execute o make e o make install para concluir a instalação da libmemcached. Provavelmente será necessário executar o comando make install com permissão root.

cd libmemcached-0.37
./configure
make
sudo make install

Após executar os comandos acima (eles podem levar um tempinho cada um) a dependência (libnmemcached) deve estar instalada no seu computador, agora é instalar o memcached com o pecl:

pecl install memcached

O pecl não manipula o php.ini para executar a extensão, então você precisa adicionar a linha abaixo ao seu php.ini para que a extensão nova extensão seja carregada.

extension=memcache.so

No Ubuntu o php.ini normalmente fica em /etc/php/apache2/php.ini, se você não sabe onde fica o php.ini no seu Ubuntu pode utilizar o comando abaixo para localizar o arquivo:

find / -name php.ini

 

Agora é só reinicar o seu Apache:

sudo service apache2 restart

 

Pronto, o memcached está instalado e pronto para usar no seu servidor, você está pronto para melhorar a performance das suas aplicações em PHP utilizando o memcache. 😀

Dúvidas, críticas e sugestões nos comentários.

 

Referências

Install php memcached on Ubuntu

How to forge – php memcached

Como internacionalizar as mensagens nas views do Code Igniter

Estive fazendo um job junto com o @gserrano usando o Code Igniter, e tivemos a necessidade de fazer a view com mensagens internacionalizadas, uma vez que o site terá versão em espanhol e português. Mais uma vez, o framework facilitou muito a nossa vida.

Vamos lá, é simples:

  • dentro da pasta application, há uma chamada language
  • dentro de language, deve haver uma pasta para cada um dos seus idiomas
  • crie em cada uma dessas pasta um arquivo chamado {nomedocliente}_lang.php (claro, {nomedocliente} pode ser trocado por qualquer coisa. No exemplo a seguir, usarei meujob_lang.php)
  • o conteúdo do arquivo deve seguir a estrutura:
    $lang["chave1]    = "mensagem 1";
    $lang["chave2]    = "mensagem 2";
    $lang["chave3]    = "mensagem 3";
    ?>

    Ou seja, é um arquivo que conterá chaves (usadas na view) e os valores. As chaves serão sempre iguais nos diversos arquivos de internacionalização, e as mensagens, serão as mesmas, traduzidas para o idioma em questão
  • antes de usar na view essas mensagens, você deve adicionar as mesmas no controller.
    Imagine que você tenha o seguinte método em um controller:
    public function formulario() {
       $this->load->view('passo1');
    }
    O que você precisa é, antes de carregar a view, adicionar o idioma que será usado. No caso abaixo, o que fiz é carregar a view dependendo do terceiro parâmetro vindo na url (por exemplo: /meucontroller/formulario/pt_BR)
    public function formulario() {
       $this->lang->load('meujob', $this->uri->segment(3));
       $this->load->view('passo1');
    }
    Note que (1) falta uma validação do terceiro parâmetro e (2) meujob é o nome do arquivo criado lá no terceiro passo.
  • na view, basta você chamar lang->line("chave1"); ?> por exemplo, que será printada na tela a mensagem referente a chave1 do arquivo de mensagens correto.

Refefência: http://codeigniter.com/user_guide/libraries/language.html