PHP Yii Framework: Trabalhando com banco de dados na prática

Veja neste artigo como criar um sistema simples com banco de dados e relacionamentos, através do Yii Framework, escrito em PHP. A intenção deste texto é colocar em prática os conceitos básicos de banco de dados relacionais.

Para iniciar o desenvolvimento desse artigo, precisamos ter em mente o conceito do modelo de arquitetura MVC (Model-View-Controller) em PHP e ter instalado em nossa máquina a última versão estável do Yii Framework, que é a 1.1.

Cenário da aplicação

Para este tutorial será criado o portal fictício de notícias Portal News, no qual serão cadastradas notícias diariamente. Estas notícias serão publicadas apenas por usuários administradores e devem possuir apenas uma categoria.

Nota: O sistema operacional utilizado neste exemplo é o Ubuntu 14.04 LTS, com o visual alterado e aplicado o tema Macbuntu. Trataremos aqui também dos passos para quem tem o sistema operacional Windows. Os passos diferenciados em cada sistema serão explicitados.

Para iniciar a aplicação, abra o terminal (no caso do Windows é o prompt de comando no modo de administrador) e navegue até o diretório onde está localizado a pasta do Yii.

Crie a aplicação pelo utilitário Yiic. Para isso, digite o seguinte código presente na Listagem 1.

Listagem 1. Criando aplicação em sistemas operacionais Linux.

sudo ./yiic webapp ../../PortalNews/

Após criar o projeto será exibido uma mensagem semelhante à apresentada na Figura 1.

Figura 1. Aplicação criada com sucesso.

Se o sistema operacional da máquina for o Windows, digite o código presente na Listagem 2.

Listagem 2. Criando aplicação em sistemas operacionais Windows.

yiic webapp ../../PortalNews/

Estrutura do banco de dados

Este é o ponto crucial do projeto, o banco de dados. É imprescindível para um sistema a modelagem lógica, pois é com ela que será criado todo o fluxo e ações do projeto. Ainda que não seja obrigatório criar o modelo lógico para sua aplicação, é de boa prática fazê-lo. Isso faz com que o software seja bastante denso e coeso. Para este artigo será utilizado o banco de dados MySQL, na versão 5.5.37-0ubuntu0.14.04.1, com o utilitário de gerenciamento PHPMyAdmin.

Nota: Com o intuito de facilitar a didática desta matéria, os assuntos mais específicos relacionados à modelagem e banco de dados terão uma visão superficial.

Na Figura 2 segue o modelo lógico aplicado ao site fictício “PortalNews”. A partir dele será implementado o modelo físico, onde ao invés de entidades têm-se tabelas. A seguir é explicado como devemos criar o modelo lógico corretamente.

Figura 2. Modelo lógico PortalNews.

Na Figura 2 acima é representada a modelagem dos dados que serão utilizados na aplicação. A seguir temos um pequeno resumo sobre o gráfico acima:

Modelo físico

A partir deste momento toda a lógica do software está pronta, então é hora de partir para o modelo físico. O modelo físico é basicamente a “conversão” dos dados lógicos (entidades) em dados físicos (tabelas). O recurso responsável por armazenar estes dados físicos é o banco de dados.

Então, para criar a base de dados digite o seguinte código presente na Listagem 3.

Listagem 3. Criando base de dados PortalNews.

CREATE DATABASE PortalNews;

Uma vez criada a base de dados, é hora de colocar o modelo físico em prática. Antes de começar a escrever as querys (comandos) SQL para criar as tabelas, veja a seguir quais serão as alterações necessárias, sempre baseado no modelo lógico criado anteriormente:

Agora que já está clara a maneira com a qual cada entidade será representada no modelo físico, vamos à codificação. Veja o código da Listagem 4 para criar a tabela de usuários administradores do PortalNews.

Nota: É de suma importância seguir a ordem cronológica obedecida aqui para criar-se as tabelas. Devido ao fato de uma delas possuir chave(s) estrangeira(s), ocorrerá problemas ao executar suas querys (comandos) SQL em ordem inversa a proposta aqui.

Listagem 4. Criando tabela de Administradores.

CREATE TABLE IF NOT EXISTS `Administrador` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nome` varchar(300) NOT NULL, `email` varchar(300) NOT NULL, `login` varchar(300) NOT NULL, `senha` varchar(300) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Agora, siga o código da Listagem 5 para criar a tabela de Categorias.

Listagem 5. Criando tabela de Categorias.

CREATE TABLE IF NOT EXISTS `Categoria` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nome` varchar(200) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Por último, é hora de criar a tabela de Notícias. Confira na Listagem 6.

Listagem 6. Criando tabela de Notícias.

CREATE TABLE IF NOT EXISTS `Noticia` ( `id` int(11) NOT NULL AUTO_INCREMENT, `idAutor` int(11) NOT NULL, `idCategoria` int(11) NOT NULL, `data` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `titulo` varchar(400) NOT NULL, `conteudo` text NOT NULL, PRIMARY KEY (`id`), KEY `idAutor` (`idAutor`,`idCategoria`), KEY `idCategoria` (`idCategoria`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Ativação dos utilitários Gii, MySQL e URL personalizada

Agora que a aplicação e o modelo de dados estão criados, faz-se necessário o uso do utilitário Gii, que é um script do Yii responsável por gerar models, controllers, CRUDs e modules. Primeiramente acesse localhost/PortalNews para ver se a aplicação está rodando sem problemas. Confira na Figura 3.

Figura 3. Página inicial do site.

Se a aplicação estiver funcionando corretamente, vá até o diretório do projeto e abra o arquivo main.php, presente na pasta protected/config. Utilize o editor de texto de sua preferência, aqui será utilizado o Sublime Text 2, que pode ser baixado em seu site oficial (http://www.sublimetext.com/2).

Pesquise pelo trecho “uncomment the following to enable the Gii tool”. Após achá-lo descomente o trecho de código correspondente. Atente-se para alterar a senha através do parâmetro password. Aqui a senha utilizada será 123. O código descomentado ficará como na Listagem 7.

Listagem 7. Ativando utilitário Gii.

'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'123', // If removed, Gii defaults to localhost only. Edit carefully to taste. 'ipFilters'=>array('127.0.0.1','::1'), ),

Agora ative o MySQL descomentando as linhas referentes à ele. Veja na Listagem 8 como fica o código descomentado.

Listagem 8. Ativando o serviço MySQL.

'db'=>array( 'connectionString' => 'mysql:host=localhost;dbname=PortalNews', 'emulatePrepare' => true, 'username' => 'root', 'password' => '123', 'charset' => 'utf8', ),

Para ativar a URL estilo “controller/action”, descomente o código da Listagem 9.

Listagem 9: Ativando URL estilo “controller/action”.

'urlManager'=>array( 'urlFormat'=>'path', 'rules'=>array( '<controller:\w+>/<id:\d+>'=>'<controller>/view', '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>', '<controller:\w+>/<action:\w+>'=>'<controller>/<action>', ), ),

Criação dos Models

Acesse localhost/PortalNews/index.php/gii para acessar o Gii e criar os models. Confira na Figura 4 como é a página de login do Gii.

Figura 4. Tela inicial Gii.

Após logar-se no Gii com a senha definida anteriormente, clique em “Model Generator”, localizado à esquerda da tela. Confira na Figura 5 a página carregada.

Figura 5. Página “Model Generator” carregada.

No Gii é muito simples gerar models, basta colocar o nome da tabela em “Table Name”, automaticamente o nome da classe modelo (model) é preenchido. Após isso, basta clicar em “preview” e depois em “generate”. Uma mensagem semelhante à Figura 6 será exibida.

Figura 6. Model Administrador gerado com sucesso.

Execute este passo mais duas vezes e crie os models Noticia e Categoria, de acordo com as tabelas gravadas no banco de dados.

Criação dos Controllers e CRUD

Para criar os Controllers e CRUD, os passos são praticamente os mesmos. Preencha o “Controller ID” com o nome desejado. É uma boa pŕatica dar o nome ao Controller o mesmo nome da classe modelo (model), haja visto que o Yii adiciona automaticamente o sufixo “Controller” ao arquivo controlador.

Realize este passo mais duas vezes para gerar os controladores e CRUDs Categoria e Noticia. Após gerar o controller será exibida uma mensagem como na Figura 7.

Figura 7. Controller Administrador gerado com sucesso.

Cadastro de Usuários Administradores

Uma vez gerado os models, controllers e views necessários para rodar a aplicação, cadastre um novo usuário no sistema. Acesse localhost/PortalNews/index.php/administrador/create, entre com o login e senha para cadastrar um novo usuário.

Nota: A autenticação dos usuários por login e senha não será visto neste artigo, pois causaria uma larga extensão deste. Utilize o login padrão do Yii para se logar: admin/admin ou demo/demo.

Após logar-se no sistema, será carregada a página de cadastro de usuários e posteriormente a tela com usuário cadastrado. Confira nas Figuras 8 e 9.

Figura 8. Formulário de cadastro do Administrador.

Figura 9. Usuário de teste cadastrado como Administrador.

Cadastro de Categorias

Para cadastrar novas categorias no sistema acesse localhost/PortalNews/index.php/categoria/create, dê um nome à categoria e então clique em “Create”. Confira na Figura 10 a página de categoria cadastrada.

Figura 10. Categoria cadastrada com sucesso.

Cadastro de Notícias

Aqui está um dos pontos mais importantes desta matéria, pois é neste momento que será aplicado o relacionamento entre as entidades (tabelas). Ao acessar a página de cadastro de notícias será visualizado a seguinte página presente na Figura 11.

Figura 11. Formulário para cadastrar notícias.

Para tornar o formulário mais intuitivo e fácil de se cadastrar notícia, será colocado dois checkboxes com os nomes dos Autores e Categorias cadastradas, ao invés de mandar os textboxes criadas pelo padrão do Yii. Veja o código das Listagens 10, 11 e 12.

Com o intuito de tornar mais dinâmico os formulários da sua aplicação, o Yii cria o arquivo CREATE (localizado em protected/views/nomeDoControlador), que é o responsável por renderizar uma Visão Parcial, ou seja, é renderizado uma view “dentro” da outra. Esta ação ocorre através do método renderPartial(), da classe Controller. Devido a isso, é necessário primeiro passar os dados para o CREATE e depois encaminhá-los até o _form.php .

Listagem 10. Passando os Autores e Categorias para o arquivo CREATE, do cadastro de notícias.

// Action CREATE do model Noticia, arquivo NoticiaController.php public function actionCreate() { $model=new Noticia; $categorias = Categoria::model()->findAll(); $autores = Administrador::model()->findAll(); // Uncomment the following line if AJAX validation is needed // $this->performAjaxValidation($model); if(isset($_POST['Noticia'])) { $model->attributes=$_POST['Noticia']; if($model->save()) $this->redirect(array('view','id'=>$model->id)); } // Passando os dados pegos da actionCreate para a View Create. $this->render('create',array( 'model'=>$model, 'categorias'=>$categorias, 'autores'=>$autores, )); }

Listagem 11. Passando os dados resgatados na view Create.

// O código acima foi omitido para melhor visualização <h1>Create Noticia</h1> <?php $this->renderPartial('_form', array('model'=>$model, 'autores'=>$autores, 'categorias'=>$categorias)); ?>

Listagem 12. Formulário com as checkboxes inseridas.

// Variáveis autores e categorias são adindas da view Create. <div class="row"> <select name="Noticia[idAutor]"> <?php for ($i=0; $i < count($autores); $i++): ?> <option value="<?php echo $autores[$i]['id']; ?>"><?php echo $autores[$i]['nome']; ?></option> <?php endfor; ?> </select> </div> <div class="row"> <select name="Noticia[idCategoria]"> <?php for ($i=0; $i < count($categorias); $i++): ?> <option value="<?php echo $categorias[$i]['id']; ?>"><?php echo $categorias[$i]['nome']; ?></option> <?php endfor; ?> </select> </div>

Com isso o formulário ficou conforme o mostrado na Figura 12.

Figura 12. Formulário para cadastrar notícias.

Esta foi uma breve introdução sobre como funcionam os bancos de dados relacionais e como o Yii Framework tratam estes dados.

Gostou do artigo? Quer dar sua opinião? Deixe seu comentário e até a próxima!

Artigos relacionados