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..

  1. Faça o download do Kohana no site http://kohanaphp.com/
  2. Renomeie a pasta Kohana_vX.X.X para agenda.
  3. Deixe o diretório application/logs com permissão para escrita.
  4. 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.

  1. Apague todos arquivos que estão dentro da pasta application/controllers
  2. 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. ;)

5 Responses to “Kohana: Mini How-To”

  1. douglas

    Legal. Mas eu só entendo quando vejo funcionando..
    Depois vo testar.
    vlw caio

  2. anderson

    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

    <?php 
    foreach($result as $tuples)
    {
    	echo '';
    	echo '' . $tuples->id; 
    	echo '' . $tuples->name;
    	echo '' . $tuples->phone;
     
    	echo '' . html::anchor('contacts/edit/' . $tuples->id, 'Editar');
     
    	echo '';
    	echo '';
    }
    ?>

    Abraços,
    Anderson

  3. Caio Ariede

    anderson,

    Realmente estava faltando o foreach no código, já alterei ali o contacts.php.

    Obrigado pelo comentário e pela atenção.

  4. thiago

    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

  5. Caio Ariede

    É 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.


Deixe um comentário



Voltar ao topo