Como desenvolver MVC modular para web. Básico com CodeIgniter. (Parte 4/4)

Objetivo – Parte 4

Você aprendeu a criar seu espaço de trabalho, manipular o banco de dados e permitir que o usuário interaja com a aplicação a partir de uma interface gráfica. Agora tudo será levado para um novo level e será escrito com a estrutura MVC.

Esta é a quarta parte do tutorial. Se deseja ver a primeira, segunda e terceira parte, os links estão logo abaixo:

Bora criar nossa aplicação com MVC de verdade!

EXERCÍCIO: FAZER O BOTÃO “EDITAR” FUNCIONAR. A model já está completa. Apenas a controller precisa ser modificada, completando o método “edit()” e uma nova view para a página de edição deve ser criada.

O resultado deve ser igual ou simular ao do link abaixo:

https://apps.thenets.org/examples/ci_pokemon/


9. MVC + CRUD

Começaremos a partir de um projeto quase pronto. Ele possui somente o CREATE, READ e DELETE do nosso CRUD para a classe “Trainer”. E nosso objetivo será criar o UPDATE.

Lembrando, CRUD significa: Create, Read, Update e Delete.

Essa será a estrutura final dos arquivos nesta quarta parte:

CI HMVC Trainers

Clone este novo projeto do GitHub e renomeie-o. Basta rodar as duas linhas seguintes no terminal:

git clone https://github.com/thenets/codeigniter_pokemon.git
move codeigniter_pokemon ci_pokemon

Ótimo, agora temos o novo projeto. Configure os arquivos “application/config/config.php” e “application/config/database.php”, como ensinado na “Parte 1”.

Execute a aplicação e terá um resultado próximo a este:

Application - Example

Tente adicionar novos treinadores, excluí-los e, quando for editá-los, terá uma surpresa. Nesta quarta e última parte do tutorial, ensinarei a fazer o botão de “Editar” funcionar corretamente. (na verdade, este é o exercício. O tutorial completo será disponibilizado somente após o dia 27/4)

 

10.1. Model

Abaixo está o diagrama UML da nossa aplicação. Para um futuro tutorial podemos desenvolver uma aplicação com todas as três classes, mas o foco por enquanto é código.

O projeto do GitHub “codeigniter_pokemon.git” contém apenas a model do “Trainer”.

Pokémon - Model

 

A abra a model “application/modules/trainers/models/Trainer.php”.

Atributos

Estes são os atributos. Perceba que os atributos são iguais as colunas da tabela “trainers” que criamos no banco de dados. São eles que guardarão os dados do nosso objeto “Trainer” a ser futuramente persistido no banco de dados.

class Trainer extends CI_Model {
 public $id_trainer;
 public $name;
 public $description;
 public $money;
 public $discovered_pokemons;

Construtor (instanciar um objeto)

Este é o método construtor. Tudo o que está dentro dele é executado sempre que um novo objeto Trainer é instanciado. Ou seja, sempre que rodamos o comando “new Trainer()”. A explicação do por quê o criei está nos comentários abaixo. Alguns atributos devem ser diferentes ou não existir se o objeto está sendo criado pela primeira vez, ao invés de ser sido obtido a partir do banco de dados:

 /*
  Construtor
 */
 public function __construct ($id_trainer=0) {
 
   /*
     Recupera um trainer já existente do banco de dados
     @ se $id_trainer for passado como parâmetro
   */
   if ($id_trainer) {
     (...)
   }


   /*
     Adicionar novo trainador
     @ se $id_trainer não for passado como parâmetro
   */
   else {
     // Remove os atributos id_trainer e created, já que eles serão
     // automaticamente gerado pelo banco de dados.
     (...)
   }
  }

Salvar no banco de dados (persistência)

Com o Trainador criado, precisamos salvá-lo no banco de dados. Note que este método faz tanto o papel do UPDATE (atualiza), quanto do INSERT (salva).

  /*
      Adiciona ou atualiza o trainador no banco de dados
  */
  public function save () {
      // Atualiza
      //  @ verifico se o atributo "id_trainer" existe neste objeto.
      //    lembrando que este atributo é apagado se criamos um novo trainer.
      if ( isset($this->id_trainer) ) {
          (...)
      }

      // Salva
      else {
          (...)
      }
  }

Remover do banco de dados

Agora o DELETE do nosso CRUD. Apaga o objeto que foi persistido no banco de dados:

  /*
      Deleta o trainador do banco de dados
  */
  public function delete () {
      (...)
  }

Obter lista de objetos do banco de dados

Por último, o READ do nosso CRUD. Ele é um tanto diferente, com um método estático. Isso significa que não precisamos instanciar um novo objeto do tipo Trainer para executá-lo:

  /*
      Obtém uma lista de todos os trainadores
  */
  public static function getTrainers () {
      (...)
  }

 

 

10.2. Controller

(Exercício)

Você já aprendeu como obter dados do usuário, criar navegação com passagem de parâmetros e receber formulário do usuário.

Com tudo isso, crie o método “edit ()” da controller Trainers.

(/Exercício)

 

10.3. View

(Exercício)

Recomendo que a view do “edit” fique em “application/modules/trainers/views/edit.php”. Porém, funcionando, tanto faz o nome do arquivo. Acima é apenas o padrão de nomes que eu uso.

(/Exercício)