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:
<?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:
<?php
use \Core\Route;
return [
new Route('/page/:id', 'page', 'one'),
new Route('/pages/', 'page', 'all'),
];
?>
Ohjain
Teemme ohjaimen:
<?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:
<h1><?= $h1; ?></h1>
<div id="content">
<?= $text; ?>
</div>
Teemme näkymän metodille all:
<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
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.