Ir para o conteúdo

Framework PHP: CodeIgniter

Frameworks PHP têm como objectivo facilitar o desenvolvimento de aplicações PHP. Num caso específico, a framework CodeIgniter, usa vários métodos para atingir esse fim. Explicando melhor, ela usa estruturas que facilitam uma fácil organização do projecto, evitando, na maioria, más práticas de programação. Mais especificamente, a framework CodeIgniter usa a estrutura MVC1 para a organização básica da aplicação, tendo também helpers, hooks, entre outros. No entanto, o utilizador pode contornar estas regras, e tentar adaptar a organização do projecto aos nossos métodos de trabalho e, principalmente, às necessidades específicas de cada projecto.

Nota: Pode fazer o download do CodeIgniter aqui.

Estruturas MVC

As estruturas MVC estão divididas em três grupos, tal como o próprio nome indica:

  • Model
    Esta estrutura serve para interagirmos com a base de dados.
  • View
    Esta estrutura permite armazenarmos HTML em massa, como por exemplo, num blog, um post tem sempre o mesmo aspecto e deve ser costumizável. Esta estrutura permite obter o HTMl e substituir os campos dinâmicos. Para já, encaremos esta estrutura como um template de algo.
  • Controller
    Os controladores são, talvez, as principais estruturas de controlo numa aplicação PHP com estrutura MVC, pois são, a partir delas que tudo se gera na aplicação. De uma maneira básica, dependendo do URL, serão chamados diferentes controladores que modificarão o desempenho da aplicação.

Model

Os modelos permitem interagir com a base de dados. De uma maneira sucinta, atribuem apenas mais organização à aplicação, tendo, no entanto, algumas mais especificações. Convém avisar que no CodeIgniter, praticamente tudo gira à volta de classes. Assim sendo, os modelos não são nada mais do que classes criadas por nós a que expandimos a principal do CodeIgniter para termos um leque vasto de funções pré-definidas, nomeadamente de interacção com a Base de Dados.

Ideia: Para aprender a trabalhar com modelos, tem um excelente e muito completo artigo sobre modelos na documentação oficial

aqui.

View

As vistas são ficheiros que contêm templates simples. Por exemplo, no caso de um blog, pode-se ter uma vista para os posts, para as páginas. Podemos até mesmo ter uma vista para o layout. É importante que tenhamos o nosso projecto organizado em vistas para que o código PHP não fique demasiado confuso. Para criarmos uma vista basta criarmos um ficheiro com o nome da vista na pasta application/views/.

<html>
<head>
<title>O Meu Blog</title>
</head>
<body>
    <h1><?php echo $title; ?></h1>
</body>
</html>

Para carregarmos a vista, basta evocar a função load no controlador.

$data["title"] = "O meu Blog";
$this->load->view('name', $data, false);
  1. O primeiro parâmetro indica o nome da vista. Se este estiver dentro de alguma sub-pasta, basta indicar o caminho relativo da pasta views até ele.
  2. [Opcional] O segundo parâmetro permite-nos incluir dados dinâmicos na vista, através de um array, cujos elementos têm o mesmo nome que os das variáveis impressas na vista.
  3. [Opcional] O terceiro parâmetro permite-nos definir se o conteúdo obtido da vista é impresso para a página automaticamente (false) ou se retorna através da função (true).

Importante: Se definirmos como true, necessitamos de atribuir a uma variável a função de carregar.

$data["title"] = "O meu Blog";
$output = $this->load->view('name', $data, true);

Nota: Se a extensão da vista por .php, na função load não é necessário indicá-la.

Ideia: Para aprender a trabalhar com as vistas, tem um excelente e muito completo artigo sobre modelos na documentação oficial aqui.

Controller

Os controladores são o "coração" da aplicação. Basicamente, são eles que definem como é que uma aplicação se deve comportar. Sim, porque nós podemos ter as vistas criadas, os modelos criados, mas temos de lhes dar uso. Assim sendo, os controladores são classes, também, que são chamadas através da própria framework. Vamos por partes, criamos um ficheiro na pasta controllers, e o nome desse ficheiro deve ter sempre o mesmo nome que a classe que ele inclui, exceptuando que o nome do ficheiro é, e deve ser sempre em minúsculas, em quanto que a classe deve começar com maiúsculas. Depois de criado, devemos ter este código por defeito.

<?php
class Blog extends Controller {

    function index()
    {
        echo 'Hello World!';
    }
}
?>

A função index é a chamada por defeito, se nenhuma outra for chamada.

Importante: O CodeIgniter não usa query string para definir "onde estamos", mas sim URI. Ou seja, o endereço da nossa aplicação deverá ser algo como isto: xpto/index.php/blog. No entanto, se o endereço tiver mais segmentos, estes serão utilizados para precisar mais a acção a executar. Por exemplo: xpto/index.php/blog/mostrar/2. Assim, ele vai instanciar o controlador blog, como no exemplo anterior, mas vai também chamar a função mostrar, executando o parâmetro 2 na função chamada, que neste exemplo poderia ser o id do post a mostrar. O URL pode ter quantos segmentos você quiser, e ele irão identificar:

  1. O controlador
  2. A função
  3. Os parâmetros da função2

É possível também criarmos pastas dentro da pasta controllers. Assim, é-nos possível dividir ainda mais o endereço. Este ficará como algo do género: blog/article/mostrar/2

  1. blog é o nome da pasta que nós criamos
  2. article é o nome da classe.
  3. mostrar é o nome da função
  4. 2 é o parâmetro da função.

Podemos ter quantos sub-níveis nós quisermos.

Helpers

Os helpers, ao contrário do comum de todas as estruturas da framework CodeIgniter, não usam classes. Em vez disso são simples funções que servem para nos facilitar a vida. A própria framework já traz um vasto leque de helpers bastante úteis, mas pode ver uma lista completa deles aqui. Mas podemos também criar os nossos próprios helpers, para isso basta criar um ficheiro na pasta helpers com o nome: MY_nome-do-helper_helper.php.

  1. My_ é o prefixo.
  2. nome-do-helper é o nome que nós escolhemos para o helper. Note-se que cada helper tem de ter um nome único.
  3. _helper é também obrigatório, e indica que é um helper.

Pode mudar o prefixo dos helpers, basta abrir o ficheiro application/config/config.php e alternado esta variável:

$config['subclass_prefix'] = 'MY_';

Aviso: O Prefixo CI_ é usado pelos helpers nativos do CodeIgniter, pelo que não pode usar este prefixo.

Libraries

As libraries (bibliotecas) permitem definir classes para auxiliar no desenvolvimento de aplicações web, à semelhança dos helpers. As bibliotecas são classes, com um conjunto de funções comuns. Assim, é possível aos programadores seguirem uma abordagem POO (Programação Orientada a Objectos, do inglês OOP, Object Oriented Programming), se assim o desejarem. Um exemplo de uma biblioteca:

<?php if ( ! defined('BASEPATH')) exit('Acesso directo negado!');

class Biblioteca {

    public function uma_funcao()
    {
      // logica da função aqui
    }
}

/* End of file Biblioteca.php */

É recomendado seguir a convenção definida pelo CodeIgniter para organização das bibliotecas:

  • Os nomes de ficheiro devem estar em maiúsculas, assim como o nome da classe (Biblioteca)
  • O nome do ficheiro deve corresponder ao nome da classe, seguido de .php (Biblioteca.php).

Ao contrário dos helpers, as bibliotecas têm de ser chamadas através da instância do CodeIgniter, isto é:

// carregar a biblioteca anteriormente criada
// não é necessário indicar a extensão PHP ou começar por maiúscula
$this->load->library('biblioteca');

// Chamar a função da biblioteca
// Notar que biblioteca é agora parte da instância do CodeIgniter
// e deve ser acedido em minúsculas sempre!
$this->biblioteca->uma_funcao(); 

As funções podem ter tipo de retorno ou não, funcionando tal e qual como uma classe normalíssima.

Adicionalmente, é possível estender ou mesmo substituir bibliotecas já incluídas no CodeIgniter. Para estender uma classe, e adicionar alguns métodos ou substituir algum dos já implementadas, basta criar uma classe com o mesmo nome da biblioteca que queremos substituir. Por exemplo, para estender classe de email incluída no CodeIgniter:

class MY_Email extends CI_Email {
   public function secure_send()
   {
       // logica da função aqui
   }
}

Importante: O prefixo MY_ (que é possível alterar na configuração) deve estar presente quando queremos estender uma biblioteca do CodeIgniter.

Para substituir por completo uma biblioteca do CodeIgniter, deve-se usar o mesmo nome da biblioteca interna. Por exemplo, para substituir a biblioteca Email:

class CI_Email {
  public function send() {
    echo "O envio de correio está desactivado";
    return false;
  }
}

Em ambos os casos, a nova biblioteca Email continua a ser chamada de forma tradicional:

$this->load->library('email');
$this->email->send();

  1. MVC significa Model - View - Controller, mas iremos explorar isto mais tarde 

  2. É aqui que varia o número de segmentos