Kohana: Mini How-To
Neste tutorial, quero demonstrar a criação de uma aplicação usando o framework Kohana, que eu tenho utilizado muito no meu dia-a-dia, e acho que merece a atenção de todos que procuram um framework que facilite o desenvolvimento de aplicações php/web.
Algumas dúvidas relacionadas a este material podem ser retiradas através do documentação do próprio Kohana PHP, em http://docs.kohanaphp.com/.
Começando *bem* do começo, o começo do começo..
- Faça o download do Kohana no site http://kohanaphp.com/
- Renomeie a pasta Kohana_vX.X.X para agenda.
- Deixe o diretório application/logs com permissão para escrita.
- Edite o arquivo application/config.php e altere site_domain para o respectivo caminho onde se encontra o kohana, /agenda/, caso seja http://localhost/agenda/.
E vamos lá..
Primeiro vamos “limpar” o kohana, removendo os exemplos, que nesse tutorial, não serão utilizados.
- Apague todos arquivos que estão dentro da pasta application/controllers
- Apague todos arquivos que estão dentro da pasta application/views
Crie um novo arquivo, application/controllers/agenda.php, que será um controller.
<?php defined('SYSPATH') or die('No direct script access.'); class Agenda_Controller extends Controller { public function create() { /* Aqui iremos chamar a view, que esta localizada dentro * da pasta "views/", o .php pode ser omitido. */ $view = new View('create'); $view->render(true); } } ?>
Crie agora, o arquivo application/views/create.php, que será a view chamada pelo método create dentro do controller Agenda.
<form action="<?php echo url::site('agenda/create'); ?>" method="post"> <label for="name">Nome:</label> <input id="name" name="name" type="text" /> <label for="phone">Telefone:</label> <input id="phone" name="phone" type="text" /> <input type="submit" value="Salvar" /> </form>
Repare, que na view create.php, usamos o método url::site(). O método site, faz parte do helper url, que contém um conjunto de métodos úteis que ajudaram no desenvolvimento de suas aplicações, o método site retorna o caminho site_domain + controller/metodo.
Aqui já podemos chamar a url http://localhost/agenda/index.php/agenda/create
E através dessa url você já pode perceber que o formato das url’s é:
index.php/controller/método
Caso queira, você também pode usar subdiretórios dentro da pasta applications/controllers, por exemplo agenda/escola/contatos.php, onde contatos.php é um controller com nome Contatos_Controller, e pode ser acessado através da url agenda/index.php/agenda/escola/contatos. Enfim, isso não vem ao caso agora.
Voltando, vamos dar vida a nossa aplicação. Crie um banco de dados para a agenda:
CREATE DATABASE `agenda` ; CREATE TABLE `agenda`.`contacts` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `phone` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
Agora, copie o arquivo system/config/database.php para application/config/database.php, na pasta system/config ficam todos arquivos de configuração padrão, como nós não vamos usar uma “base de dados padrão”, então copiamos o arquivo para a pasta da nossa aplicação.
Edite o arquivo application/config/database.php, configurando o acesso ao seu banco de dados:
‘user’ => ‘usuário’,
‘pass’ => ’senha_do_usuario’,
‘database’ => ‘agenda’
E então vamos alterar o método create no nosso controller agenda, para que adicione nossos dados ao banco de dados.
public function create() { if (request::method() == 'post') { $name = (string) @$_POST['name']; $phone = (string) @$_POST['phone']; // aqui inserimos os dados no banco $db = new Database; $db->insert('contacts', array('name' => $name, 'phone' => $phone)); // redirecionamos para o metodo "contacts" url::redirect('agenda/contacts'); } /* Aqui iremos chamar a view, que esta localizada dentro * da pasta "views/", o .php pode ser omitido. */ $view = new View('create'); $view->render(true); }
Você já pode testar o formulário, porém ele dará erro, pois ainda não criamos o método contacts, que será criado agora:
public function contacts() { /* Primeiro vamos retornar a lista de contatos do banco de dados * e guarda-la na variável $result */ $db = new Database; $result = $db->get('contacts'); /* Aqui iremos chamar a view (views/contacts.php), * passando a variável de nome "result". */ $view = new View('contacts', array('result' => $result)); $view->render(true); }
E a view contacts.php ficará assim:
<table border="0"> <tbody> <tr> <th>ID</th> <th>Nome</th> <th>Telefone</th> <th></th> </tr> <?php foreach ($result as $r): ?> <tr> <td><?php echo $r->id; ?></td> <td><?php echo $r->name; ?></td> <td><?php echo $r->phone; ?></td> <td> <?php echo html::anchor('contacts/edit/' . $r->id), 'Editar'); ?> </td> </tr> <?php endforeach; ?> </tbody></table>
Observe que foi utilizado mais um helper, html::anchor(), que basicamente cria um link <a href=”">…</a>.
Bom, agora que já temos o método create, o contacts (list) falta o edit, certo?
public function edit($id = null) { $db = new Database; $id = (int) $id; $result = $db->limit(1)->getwhere('contacts', array('id' => $id)); if (count($result) == 0) { /* Caso não exista um contato com este id * retorna uma página "not found" do kohana */ Event::run('system.404'); } /* Se chegou até aqui, é porque achou o registro */ $row = $result[0]; /* Conferimos se é um método http post, * se for, salvamos o registro */ if (request::method() == 'post') { $name = (string) @$_POST['name']; $phone = (string) @$_POST['phone']; // aqui inserimos os dados no banco $db = new Database; $db->update('contacts', array('name' => $name, 'phone' => $phone), array('id' => $row->id)); // redirecionamos para o metodo "contacts" url::redirect('agenda/contacts'); } /* E então, chamamos a view responsável.. */ $view = new View('edit', array('row' => $row)); $view->render(true); }
E então a view edit.php
<form action="<?php echo url::site('agenda/edit/' . $row->id); ?>" method="post"> <label for="name">Nome:</label> <input id="name" name="name" type="text" value="<?php echo $row->name; ?>" /> <label for="phone">Telefone:</label> <input id="phone" name="phone" type="text" value="<?php echo $row->phone; ?>" /> <input type="submit" value="Salvar" /> </form>
Deixe o seu comentário. ;)
2008-09-01 at 3.47 pm
Legal. Mas eu só entendo quando vejo funcionando..
Depois vo testar.
vlw caio
2008-10-11 at 1.40 pm
Olá,
Tentei executar esse código, mas obtive um erro na view “contacts.php”. Consegui consertá-lo usando um “foreach” para exibir os dados contidos em “$result”. O código alterado ficou da seguinte maneira:
ID
Nome
Telefone
Abraços,
Anderson
2008-10-13 at 9.58 am
anderson,
Realmente estava faltando o foreach no código, já alterei ali o contacts.php.
Obrigado pelo comentário e pela atenção.
2008-10-22 at 9.58 am
Olá
tentei executar seu exemplo e outros exemplos mas sempre me deparo com o mesmo erro
“Fatal error: Cannot redeclare class Welcome_Controller ….” sempre da esse erro de redeclarar classe, já tentei de tudo e nada. Vc saberia o que pode estar ocorrendo ?
Grato
Thiago
2008-10-22 at 10.52 am
É o seguinte Thiago, o nome da classe deve seguir o padrão abaixo:
arquivo: welcome.php, classe: Welcome_Controller.
arquivo: test.php, classe: Test_Controller.
Verifique se não existem 2 arquivos instanciando a mesma classe, Welcome_Controller, na pasta controllers.
Não esqueça também de dar uma olhada no arquivo system/config/routes.php.