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.