sexta-feira, 12 de dezembro de 2008

PHP: Uma introdução suave ao MVC (Parte 1)

Boa noite. Encontrei no site NEMETRAL uma explicação prática sobre o padrão de projeto MVC em PHP. Depois de pedir as devidas permissões para o dono do conteúdo, traduzi o mesmo e aqui está a primeira parte dele. Enjoy! :)

Uma introdução Suave ao MVC

O MVC é certamente o padrão de projeto mais disseminado nos dias de hoje. Trazido de volta à moda pelo Ruby on Rails em 2004, ele foi traduzido e implementado em muitas linguagens e em mais de 100 frameworks web. Este tutorial ilustrado é focado em ajuda-lo a atravessar a lacuna entre um script PHP tradicional e uma implementação completa do MVC.

Parte 1: Desmontando uma página tradicional

Você se lembra do community.com? Aqui está algo que poderia ser um script server-side (executado do lado do servidor) usado para gerar uma página mostrando todos os membros de um site (assumindo um uso mediano do PHP):

<html>

<?php include 'inc/header.php'; ?>

<h1>Members of community.com:</h1>
<?php
// INITIALIZING THE DATABASE
$connection = mysql_connect('host', 'user', 'password');
mysql_select_db('database', $connection);
// PULLING OUT THE DATA
$data = mysql_query('SELECT name FROM members');
// DISPLAYING THE DATA
echo '<ul>';
$i = 1;
while ($member = mysql_fetch_array($data)) {
echo '<li>Member #' . $i . ': '. $member['name'] . '</li>';
$i++;
}
echo '</ul>';
?>

</html>

o arquivo inc/header.php fica da seguinte forma:

<head>
<title>Community.com rocks!</title>
</head>

Nota: Este é um HTML muito básico sem um DOCTYPE

Uma vez que os dados forem obtidos do banco de dados no meio de tags HTML, cada vez que você precisar mostrar o nome dos membros do site, você precisa reescrever o trecho PHP/SQL, o que torna mais difícil dar manutenção no seu código. Ainda assim, embora esta não seja uma forma impecável de escrever um código, esta não é uma maneira "burra" de escreve-lo: podemos ver o desmontamento do código através do uso do include, que faz possível começar a dividir o código em partes reusáveis (o header, por exemplo).

Aqui estão algumas coisas que poderíamos fazer para organizar o script:

  • Remover toda a lógica PHP (consultas ao banco de dados, formatação de dados, etc) da/entre as tags HTML e colar tudo acima da tag .
  • Usar variáveis PHP (preenchidas com os dados obtidos do banco de dados) para armazenar dados das/entre tags HTML.
  • Divisão do script: um para a lógica e o outro para a apresentação (baseado em variáveis PHP).

Aqui está um gráfico simples para entender melhor o processo:

O primeiro passo é o script original onde lógica de negócios (consulta ao banco de dados, obtendo os dados do banco de dados) é misturado com tags HTML. No segundo passo isolamos a lógica no início do script, mantendo as tags HTML abaixo do script e ligando os dois utilizando variáveis PHP. O terceiro passo é o passo final: nós simplesmente dividimos o script em duas partes (uma para a lógica e a outra para a apresentação em HTML). Aplicado ao nosso código, este seria o resultado no passo 3:

<?php
$connection = mysql_connect('host', 'user', 'password');
mysql_select_db('database', $connection);

$data = mysql_query('SELECT name FROM members');
$members = array();
while ($item = mysql_fetch_array($data)) {
$members[] = $item['name'];
}

include 'tpl/template.php';
?>

o arquivo tpl/template.php fica da seguinte forma:

<html>
<?php include 'tpl/header.php'; ?>
<h1>Members of community.com:</h1>
<ul>
<?php foreach ($members as $i => $member) : ?>

<li>Member #<?php echo $i + 1; ?>: <?php echo $member; ?></li>
<?php endforeach; ?>
</ul>
</html>

Nota: quando utilizamos o PHP como um template engine (isto é como estamos fazendo no segundo arquivo), é muito comum usar estruturas alternativas. Note também que mudei o diretório 'inc' para 'tpl', sendo este último encarregado de reunir todos os arquivos de template (o arquivo tpl/header, no passo 3 é o mesmo que o arquivo inc/header.php no passo 1).

Uma vez analisado, será exibida a seguinte saída HTML (supondo que existam apenas dois membros: Anna e Lisa):

<html>
<head>
<title>Community.com rocks!</title>
</head>
<h1>Members of community.com:</h1>

<ul>
<li>Member #1: Anna</li>
<li>Member #2: Lisa</li>
</ul>
</html>

Agora vamos nos afastar do script e dar uma olhada em toda a estrutura de requisições/respostas. Quando chamamos http://community.com/members.php, aqui está o que acontece:

  • o arquivo members.php obtém uma conexão com o banco de dados, obtém todos os nomes dos membros e preenche um array com eles (chamado de $members).

  • o arquivo members.php inclui o arquivo de template onde a variável $members é iterada e desta maneira é produzido o HTML final.

Isto pode ser chamado de arquitetura de View/Controller (Visão/Controle), onde o arquivo members.php é o controller e o arquivo tpl/template.php é o view:

Procedendo desta maneira, é possível separar a lógica da apresentação: primeiro executamos todas as consultas e então geramos a página HTML utilizando variáveis PHP.

Referências
Nemetral - Artigo Original (Parte 1)

5 comentários:

Daniel Medina disse...

muito bom o artigo.
mas qual é a grande vantagem das estruturas alternativas? semântica?

Linux Dummy disse...

Bom dia Guardião do Livro. Muito obrigado pela visita. :)

Como apenas traduzi o artigo, não sei responder à sua questão. Também fiquei em dúvida. Talvez seja o mais usado em template engines...

Se alguém souber esclarecer a afirmação do autor do artigo, por favor, compartilhe.

Um grande abraço.

Anônimo disse...

Æ!!

Na verdade não é bem uma estrutura MVC, pois na verdade não tem o elemento Model para referenciar o que é banco de dados.

Apenas temos o elemento "view" que vai mostrar a parte visual do site, e o elemento "Controller" que vai cuidar da lógica do site, mas nesse caso o elemento controller tambem está cuidando da interação com o banco de dados.

Quanto as estruturas alternativas, eu creio que ele esteja falando da interação entre colocar o código HTML dentro de uma variável utilizando condicionais para depois apresentar a variável dentro do template.

Há braços

Daniel Medina disse...

em relação à camada model, tem uma parte 2... dá uma olhada... não li tudo, mas já começa a falar da model.

Anônimo disse...

get facebook likes
buy facebook likes

http://www.macygray.com/node/243 http://weeklyseven.com/news/2011/january/20/george-knapp?quicktabs_3=0
facebook likes buy facebook likes get facebook likes
Computer acting up...I need an antivirus of some kind. NOT willing to pay megabux for it. Anyone know of a DIRT CHEAP/ FREE way to download one?

facebook likes 1000 facebook likes [url=http://1000fbfans.info]buy facebook likes [/url] facebook likes