Aplicação do MVC em PHP

Vamos dar uma olhada na aplicação conjunta de tudo o que foi estudado. Suponha, por exemplo, que nós tenhamos alguns artigos/páginas no nosso site. Nós queremos mostrar um único artigo ou mostrar todos os artigos. Vamos ver como fazer isso no nosso framework.

Tabela no BD

Para começar, vamos criar uma tabela pages no banco de dados. Vamos adicionar as colunas id, title e text. Vamos preencher esta tabela com alguns dados via PhpMyAdmin.

Modelo

Vamos criar um modelo com um método para obter um único registro e um método para obter todos os registros:

/project/models/Page.php<?php
  namespace Project\Models;
  use \Core\Model;
  
  class Page extends Model
  {
    public function getById($id)
    {
      return $this->findOne("SELECT * FROM pages WHERE id=$id");
    }
    
    public function getAll()
    {
      return $this->findMany("SELECT id, title FROM pages");
    }
  }
?>

Roteamento

Vamos criar o roteamento correspondente:

/project/config/routes.php<?php
  use \Core\Route;
  
  return [
    new Route('/page/:id', 'page', 'one'),
    new Route('/pages/',   'page', 'all'),
  ];
?>

Controlador

Vamos criar o controlador:

project/controllers/PageController.php<?php
  namespace Project\Controllers;
  use \Core\Controller;
  use \Project\Models\Page;
  
  class PageController extends Controller
  {
    public function one($params)
    {
      $page = (new Page) -> getById($params['id']);
      
      $this->title = $page['title'];
      return $this->render('page/one', [
        'text' => $page['text'],
        'h1' => $this->title
      ]);
    }
    
    public function all()
    {
      $this->title = 'Lista de todas as páginas';
      
      $pages = (new Page) -> getAll();
      return $this->render('page/all', [
        'pages' => $pages,
        'h1' => $this->title
      ]);
    }
  }
?>

Views

Vamos criar a view para o método one:

/project/views/page/one.php<h1><?= $h1; ?></h1>
<div id="content">
  <?= $text; ?>
</div>

Vamos criar a view para o método all:

/project/views/page/all.php<h1><?= $h1; ?></h1>
<div id="content">
  <table>
    <tr>
      <th>id</th>
      <th>title</th>
      <th>link</th>
    </tr>
    <?php foreach ($pages as $page): ?>
    <tr>
      <td><?= $page['id']; ?></td>
      <td><?= $page['title']; ?></td>
      <td><a href="/page/<?= $page['id']; ?>/">link para a página</td>
    </tr>
    <?php endforeach; ?>
  </table>
</div>

Tarefas Práticas

Задание 1

Suponha que você tenha produtos no seu banco de dados. Cada produto contém um nome, um preço, uma quantidade e uma descrição. Implemente a exibição de um único produto por id e de todos os produtos de forma semelhante ao que foi feito na teoria.