Представления в MVC на PHP
Давайте теперь добавим нашим действиям представления.
По правилам нашего фреймворка представления
хранятся в папке /project/views/
.
Кроме того, в нашем фреймворке действует
соглашение: имя файла с представлением должно
совпадать с именем действия и размещаться
в папке с таким же названием, как имя контроллера.
Например, если у нас есть контроллер PageController
,
то все его представления следует хранить
в папке /project/views/page/
. Сам
файл представления должен иметь расширение
.php
. К примеру, если в контроллере
PageController
будет действие act
,
то его представление следует размещать в
/project/views/page/act.php
.
Для того, чтобы задать представление какому-нибудь
действию, это действие должно вызвать метод
render
, передав ему параметром имя
представления. Имя представления должно состоять
из имени контроллера с маленькой буквы, после
которого через /
будет записано имя
действия
Метод render
не нужно реализовывать
в контроллере - он наследуется от родительского
класса Core\Controller
. Кроме того,
для корректной работы результат работы метода
следует вернуть через return
.
Итак, пусть у нас есть контроллер Page
с действием act
. Давайте привяжем
к этому действию представление:
<?php
namespace Project\Controllers;
use Core\Controller;
class PageController extends Controller
{
public function act()
{
return $this->render('page/act');
}
}
?>
Сделаем теперь файл с HTML кодом нашего представления:
<div>
это представление
действия act контроллера page
</div>
Проделайте описанные манипуляции, а затем обратитесь к нашему действию через адресную строку. Убедитесь, что в браузере появится текст из созданного вами представления.
Передача данных в представление
С помощью второго параметра метода render
можно передавать данные из контроллера в
представление. Данные следует передавать
в виде ассоциативного массива. При этом в
представлении ключи этого массива станут
переменными с соответствующими значениями.
Давайте посмотрим на практике. Передадим в наше представление массив с тремя элементами:
<?php
namespace Project\Controllers;
use Core\Controller;
class PageController extends Controller
{
public function act()
{
return $this->render('page/act', [
'var1' => 'eee',
'var2' => 'bbb',
'var3' => 'kkk',
]);
}
}
?>
Как вы видите, ключи нашего массива - 'var1'
,
'var2'
и 'var3'
. Это значит,
что в представлении будут доступны такие
переменные и мы можем вывести их значения
в нужных местах HTML кода. Сделаем это:
<div>
это представление
действия act контроллера test
</div>
<ul>
<li><?php echo $var1; ?></li>
<li><?php echo $var2; ?></li>
<li><?php echo $var3; ?></li>
</ul>
Проделайте описанные манипуляции, а затем обратитесь к нашему действию через адресную строку. Убедитесь, что в браузере появится текст из созданного вами представления.
Передача массивов
В представление можно также передавать и массивы. Давайте, например, передадим массив юзеров:
<?php
namespace Project\Controllers;
use Core\Controller;
class PageController extends Controller
{
public function act()
{
return $this->render('page/act', [
'header' => 'список юзеров',
'users' => ['user1', 'user2', 'user3'],
]);
}
}
?>
Можно обратиться к каждому элементу массива:
<h1><?= $header ?></h1>
<ul>
<li><?= $users[0]; ?></li>
<li><?= $users[1]; ?></li>
<li><?= $users[2]; ?></li>
</ul>
А можно перебрать массив циклом и сформировать нужный HTML код:
<h1><?= $header ?></h1>
<ul>
<?php foreach ($users as $user): ?>
<li><?= $user; ?></li>
<?php endforeach; ?>
</ul>
Проделайте описанные манипуляции, а затем обратитесь к нашему действию через адресную строку. Убедитесь, что в браузере появится текст из созданного вами представления.