Controllers no Kohana

Um controller é um arquivo que contém uma classe que vai gerenciar todo o fluxo da aplicação.Se você não conhece MVC, é uma boa hora para estudar porque o Kohana é todo MVC.

MVC

Os controllers comunicam-se diretamente com os models enviando e recebendo informações, muitas das informações recebidas são repassadas as views para serem renderizadas no navegador do usuário, e podem também ser recebidas das views dentro dos controllers para serem processadas pelos models novamente.

Enfim, deu pra perceber que o controller é quem controla o fluxo de informações e da aplicação :)
Trabalhar com Controllers no Kohana é muito fácil, vamos ver como:

Convenções para Controllers

  • O arquivo deve ser gravado em application/controllers
  • O nome do arquivo deve ter o mesmo nome da classe, em minúsculo.
    Exemplo: artigos.php
  • O nome da classe deve conferir com o nome do arquivo, iniciada de Controller_ e com a primeira letra em maiúsculas.
    Exemplo: Controller_Artigos
  • A classe deve ser extendida do Controller base (ou de outro controller).
    Exemplo: Controller_Artigos extends Controllers
  • Os métodos que serão acessíveis pela URL devem ser públicos e precedidos por _action.
    Exemplo: public function action_todos()

Acessando e Requisitando um Controller

Por padrão, o acesso a um controller é feito da seguinte forma:

http://dominio.com/index.php/<controller>/<action>

Então para acessarmos o controller artigos e a action todos, nosso exemplo ficaria assim:

http://dominio.com/index.php/artigos/todos

Criando um Controller

Seguindo nosso exemplo, vamos criar um controller artigos:

application/controllers/artigos.php
class Controller_Artigos extends Controller
{
  public function action_index()
  {
    $this->request->response = "A resposta para a vida, o universo e tudo mais é 42!;
  }
}

Acessando http://dominio.com/index.php/artigos/index (ou dominio.com/artigos/ porque a action_index é a padrão, por default) teremos o seguinte resultado:

A resposta para a vida, o universo e tudo mais é 42!

Recebendo Parâmetros via URL

Como o controller é responsável pelo fluxo de informações dentro da aplicação, uma das grandes utilidades é receber informações. Uma das formas mais simples é via URL. Vamos aprimorar nosso exemplo, solicitando artigos pelo seu número:

class Controller_Artigos extends Controller
{
  public function action_index()
  {
    $this->request->response = 'A resposta para a vida, o universo e tudo mais é 42!';
  }

  public function action_ver($numero=0)
  {
    // Rotina para pesquisar artigos
    // {...}
    $this->request->response = "Você solicitou o artigo número $numero";
  }
}

No exemplo acima, acessando http://dominio.com/artigos/ver/12 teremos o seguinte retorno:

Você solicitou o artigo número 12

Um exemplo mais bacana, somando 2 números passados via URL:

class Controller_Artigos extends Controller
{
  public function action_soma($a=0,$b=0)
  {
    $this->request->response = "A soma de $a e $b é igual a ".$a+$b;
  }
}

Acessando http://dominio.com/artigos/soma/40/2 temos como retorno:

A soma de 40 e 2 é igual a 42

Funções Privadas em Controllers

Em determinadas situações precisamos manter algumas funções disponíveis como public mas não queremos que elas sejam acessadas pela URL, neste caso é só não usar o prefixo action_ no nome da function.

class Controller_Artigos extends Controller
{
  public function megasena()
  {
    $this->request->response = 'Os números da megasena são ...';
  }
}

E assim se tentarmos acessar http://dominio.com/artigos/megasena não teremos acesso a esta função dentro do controller, como esperado!

Conclusão

Nos próximos tutoriais vamos trabalhar com Views, Models e depois a troca de informações entre eles.
Qualquer problema ou dúvida, fique a vontade nos comentários.

Simples, não? É Kohana!
E é por isso que eu gosto :)

Netbeans + Tema Twilight + Fonte Monaco

Programar é uma coisa que exige do programador bom conhecimento na linguagem que ele programa. Chega um momento que as coisas começam a se tornar repetitivas e você adota um framework (ou não!) para deixar que tudo o que for chato e repetitivo seja feito por ele. Tudo vai bem até que outro momento você pensa em otimizar melhor ainda seu trabalho (ou o seu ambiente de programação) e decide repensar melhor o editor/IDE que usa para programar.

Todo mero mortal programador vai passar por isso, se você está lendo este texto com certeza está ou já esteve próximo esse pensamento. Poupando melhor o seu tempo, ano passado passei por este mesmo período e fiz o dever de casa avaliando inúmeros editores de uso livre/gratuito para minha plataforma de trabalho e … minha escolha caiu sobre o NetBeans.

Rails Code
Creative Commons License photo credit: davestfu

Se você esperava um post te convencendo a usar o NetBeans, se deu mal. Sim, ele tem suporte a edição de CSS, geração quase automática de testes unitários, documentação baseada no phpDocumentor, projetos remotos, refatoração de código, trabalho em equipe com SVN/CVS, autocomplete de funções e variáveis e muitos outros inúmeros recursos.

Netbeans com Tema Twilight e Fonte Monaco

Gosto muito de usar o NetBeans com uma fonte que vem no Mac, chamada Monaco e o tema Twilight. Porém sempre encontro problemas ao habilitar diversas versões desta fonte por ela não ser Unicode e por ai vai. Neste cenário, eu escrevi este post para ter guardado para o futuro meu setup pessoal para o NetBeans:

  1. Instalar o NetBeans (eu instalo somente a versão PHP no meu Ubuntu)
  2. Instalar o tema Twilight for NetBeans (inspirado no disponível para textmate)
    • Ferramentas » Opções » Importar
  3. Instalar a fonte Monaco Unicode em TTF no Ubuntu
    • Copiar para ~/.fonts
    • Executar fc-cache -fv
  4. Configurar o NetBeans para usar a fonte Monaco
    • Ferramentas Opções » Fontes & Cores Sintaxe » Categoria » Padrão

Técnica Pomodoro: foco e produtividade sem procrastinação

Se eu falar que a partir de hoje você vai produzir o dobro que produz, trabalhando com períodos de 25 minutos e descansando 5 minutos entre eles, você acredita? Espere, e se eu acrescentar que a cada 4 períodos completados você pode descansar um período também de 25 minutos?

Estranho não?
Mas basicamente é isso que a Pomodoro Technique ensina.

Pomodoro

Facilidade

Por tempos todos procuramos soluções eficazes para melhorar nossa produtividade, todas elas muito complexas, difíceis de colocar em prática e que no fim acabavam só virando siglas para a nossa sopa de letrinhas.

Há aproximadamente 45 dias venho usando a técnica Pomodoro diariamente quando estou desenvolvendo, e acabei me surpreendendo com a quantidade de pomodoros que são concluídas x interrupções.

Como Funciona?

  • No início do dia, reserve 1 pomodoro (25 minutos, lembra?) para organizar seu dia. Parece bobeira eu pensei isso mas depois você vê que faz muito sentido.
  • Trabalhe focado por 25 minutos em uma mesma tarefa sem interrupções. Eu falei sem interrupções?
  • Finalizando seu pomodoro, vá curtir um intervalo de cinco minutos (Twitter? Yeah!)
  • Ao final de 4 pomodoros, faça um intervalo mais longo porque ninguém é de ferro. Eu levo isso a sério e uso 1 pomodoro pra descansar (sem interrupções, yeah!)

Tomato sauce
Creative Commons License photo credit: funadium

Você precisa de:

  • papel
  • caneta
  • algo que marque o tempo

A cada pomodoro, marque um X ao lado da tarefa. Muita gente fala em timer de cozinha pra controlar o tempo. Eu gosto de usar o FocusBooster

Interrupções

A cada interrupção, anote a tarefa/urgência em questão, e coloque-a numa lista chamada URGENTES NÃO PLANEJADOS.
Faça um pomodoro com TODAS estas tarefas, assim que possível, e resolva suas pendências, uma a uma.

Vantagens

Sensação de dever cumprido e um domínio sobre uma coisa difícil de manusear: O SEU TEMPO. Sua percepção sobre o tempo gasto e tempo disponível vai mudar completamente do que você tenha hoje em mente.

Desvantagens

Nem todos são adeptos desta técnica, e muitos dias você verá que teve o tripo de interrupções dos pomodoros completados. Invariavelmente você vai trocar o termo “horas” por “pomodoros” para qualquer atividade que irá calcular tempo necessário.

Conclusão

Enfim … é uma técnica maravilhosa que é fácil de colocar em prática e que no mesmo dia vai te mostrar que é possível ser produtivo em ciclos de 25 minutos, com a sensação de dever cumprido.

No site oficial tem materiais disponíveis, como o livro oficial, folha de TODO e o meu preferido Cheat Sheet.

Ps: Esse post foi escrito num Pomodoro de descanso, agora me dê licença que eu quero completar mais pomodoros :)

Usando Memcache com Kohana PHP

O Memcache é um sistema de cache de memória distribuída de alta performance, que permite acesso rápido a objetos que são armazenados em seu cache. A utilização vai da criatividade e necessidade do programador, que pode armazenar resultados de consultas, imagens, objetos, códigos para rápido acesso posterior.

Servers
Creative Commons License photo credit: JohnSeb

O uso de Memcache normalmente segue um padrão:

  1. O aplicativo recebe uma consulta do usuário ou do aplicativo.
  2. O aplicativo verifica se os dados necessários para satisfazer a consulta estão no cache de memória.
  3. Se os dados estiverem no cache de memória, o aplicativo utiliza os dados.
  4. Se os dados não estiverem no cache de memória, o aplicativo consulta o armazenamento de dados e armazena os resultados no cache de memória para solicitações futuras.

Legal, e no Kohana?

Primeiro passo, vamos copiar o arquivo /system/config/cache.php para /application/config/cache.php
Configure o arquivo para que fique desta forma:

$config['default'] = array(
  'driver'   => 'memcache',
  'params'   => '',
  'lifetime' => 3600,
  'requests' => 1000
);

Você pode alterar os parâmetros como precisa, onde sugiro:

lifetime = 3600 segundos (1h de timeout)
requests = 1000 (mil requisições de timeout)

E se o MemCache estiver em outro servidor?

Ai está, uma dica importante! Se você não executa o MemCache no mesmo servidor do Kohana, você precisa alterar o arquivo cache_memcache.php  em application/config. Se você tiver mais de um servidor memcached, você pode adicioná-las ao array $config['servers']. Veja um exemplo:

$config['servers'] = array(
  array(
    'host' => '127.0.0.1',
    'port' => 1234,
    'persistent' => FALSE
  )
);

Exemplos

Pronto as configurações, agora é a hora tão esperada em usar o cache, e realmente é a etapa mais fácil:

// Instancia o cache
$cache = Cache::instance();

// Tentando obter dados do cache
$retorno = $cache->get('item');

if(!$retorno)
{
  // Dados não retornaram, obtendo dados da origem
  $retorno = ORM::Factory('teste')->dados();

  // Gravando novo cache
  $cache->set('item',$retorno);
}

Simples, não? É Kohana e é por isso que eu gosto!