Poznajemy funkcje extract i compact oraz zaczynamy pierwsze kroki w kierunku wprowadzenia modelu do naszego MVC. Do dzieła.
Zaczniemy od utworzenia pliku people.php:
<ul>
<?php
foreach($models as $model){
echo "<li>ID: {$model['id']}, Name: {$model['first_name']} {$model['last_name']}</li>";
}
?>
</ul>
Zapamiętajmy nazwę zmiennej – models. Takiej nazwy oczekuje plik people.php, ponadto musi ona zawierać coś iterowalnego, zawierającego tablice.
Teraz piszemy nasz model:
<?php
abstract class Model {
abstract public static function all();
}
class PersonModel {
public static function all(){
return array(
array(
'id' => 2135,
'first_name' => 'John',
'last_name' => 'Doe',
),
array(
'id' => 3245,
'first_name' => 'Sally',
'last_name' => 'Smith',
),
array(
'id' => 5342,
'first_name' => 'Jane',
'last_name' => 'Jones',
),
array(
'id' => 5623,
'first_name' => 'Peter',
'last_name' => 'Doe',
)
);
}
}
Fejkowe dane pochodzą z dokumentacji PHP dla funkcji array_column. Zawsze tam zaglądam, gdy chcę dostać tablicę tablic jakichś rekordów.
Teraz piszemy klasę kontroler:
interface BaseController {
public function render($view, $data);
}
class Controller implements BaseController {
public function render($view, $data) {
extract($data);
require __DIR__ . "/$view.php";
}
}
Render działa tak, że przekazujemy widok i dane. Dane są poddawane ekstrakcji, zaś widok dołączany za pomocą funkcji require.
Zakładam, że wszystkie pliki mamy w tym samym folderze, zaś wszystkie pliki klas w jednym pliku (niedługo coś poradzimy na to).
Teraz piszemy klasę pochodną kontrolera:
class PeopleController extends Controller {
public function list(){
$models = PersonModel::all();
parent::render("people", compact('models'));
}
}
$controller = new PeopleController();
$controller->list();
Pobieramy dane z modelu do zmiennej o nazwie models. Za pomocą compact przekazujemy tę zmienną do render, razem z nazwą widoku – to dość częsty wzorzec obserwowany w takich frameworkach, jak Laravel.
Oczywiście nie musimy korzystać z compact. Ważne, aby przekazana zmienna miała nazwę models, jak w pliku people.php:
class PeopleController extends Controller {
public function list(){
$ppl = PersonModel::all();
parent::render("people", ['models' => $ppl]);
}
}
$controller = new PeopleController();
$controller->list();
Tym niemniej warto te funkcje znać, aby nie zgłupieć czytając cudzy kod.