MVC:n käyttö PHP:ssä

Katsotaanpa kaiken opitun yhteiskäyttöä. Oletetaan esimerkiksi, että sivustollamme on joitain artikkeleita-sivuja. Haluamme joko näyttää yhden artikkelin tai näyttää kaikki artikkelit. Tarkastellaan, kuinka tämä tehdään kehystimessämme.

Taulu tietokannassa

Aluksi luomme taulun pages tietokantaan. Lisätään sinne sarakkeet id, title ja text. Täytetään tämä taulu joillakin tiedoilla PhpMyAdminin kautta.

Malli

Teemme mallin, jossa on metodi yhden tietueen hakemiseen ja metodi kaikkien tietueiden hakemiseen:

/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");
    }
  }
?>

Reititys

Teemme vastaavan reitityksen:

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

Ohjain

Teemme ohjaimen:

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 = 'Kaikkien sivujen luettelo';
      
      $pages = (new Page) -> getAll();
      return $this->render('page/all', [
        'pages' => $pages,
        'h1' => $this->title
      ]);
    }
  }
?>

Näkymät

Teemme näkymän metodille one:

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

Teemme näkymän metodille all:

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

Käytännön tehtävät

Задание 1

Oletetaan, että tietokannassasi on tuotteita. Jokainen tuote sisältää nimen, hinnan ja määrän, kuvauksen. Toteuta yhden tuotteen näyttäminen id:n perusteella ja kaikkien tuotteiden näyttäminen vastaavasti kuin teoriassa on tehty.