Доработать приложение чтобы список на главной странице формировался на основании данных их БД.
Ссылки пока просто добавить, с пустыми href
. Добавить картинку. Переверстать на флексы, чтобы получилось как-то так:
CRUD – это сокращение, от Create-Read-Update-Delete, то бишь Создавай-Читай-Обновляй-Удаляй. Набор стандартных операций, которые можно выполнять с данными.
В прошлой лабе мы довели систему до состояние, когда у нас четко выделены контролеры и представления, то есть это буквы VC из аббревиатуры MVС. Осталось теперь откуда-то взять модель, то бишь данные.
И так, в laragon помимо php встроен еще mysql, то есть система управления базой данных (скрщн СУБД).
А база данных – это на самом деле просто файлик или папка с файлами, в которой особым образом хранятся данные.
А система управления – это специальная программа, которая умеет в эту самую базу данных лазить и эти данные вытаскивать.
Причем у системы управления есть еще всякая дополнительная информация о данных, какие чаще используются, всякие проверки доступа и прочие штуки которые расширяют границы возможностей для манипуляции данными.
Тут мы создадим простую базу данных с одной табличкой, в которую запихаем несколько объектов. Объекты те же с которыми работали раньше. Только там все в файлах писали а тут будем в БД хранить. У меня это Андромеда и Орион.
Но чтобы все наши манипуляции с данными можно было бы выполнять более удобно, то, поставим сначала phpMyAdmin. Этот phpMyAdmin – это просто веб-приложение, написанное на php, из которого можно удобно управлять базой данных.
Идем на сайт https://www.phpmyadmin.net и качаем
сохраняем в папку /etc/apps
:
и распаковываем:
затем переименовываем
Теперь можно зайти по адресу http://localhost/phpMyAdmin/ и увидить:
но пока не будем внутрь заходить, так как БД не настроена.
Сначала разберемся с MySQL, в laragon встроена весьма устаревшая версия с которой phpMyAdmin работать уже не умеет.
С другой стороны если попытаться обновить MySQL то более менее адекватная версия весит примерно 800MB, что конечно перебор.
Поэтому мы воспользуемся альтернативой СУБД mysql, которая называется mariadb. Она полностью совместима с mysql и разрабатывается как полностью бесплатная альтернатива mysql с открытым исходным кодом. Часто включена во всякие linux-дистрибутивы по умолчанию.
В общем, идем сюда https://downloads.mariadb.org и тыкаем download
выбираем zip архив
и сохраняем в папку
распаковываем
затем тормозим laragon
переключаем mysql
на mariadb
И все запускаем обратно.
Теперь собственно можно заходить через phpMyAdmin. Идем сюда http://localhost/phpMyAdmin/
и вводим данные для входа (юзер: root, пароль пустой):
и видим такое:
тыкаем слева Создать БД
пишем название БД (я назову ее outer_space
) и выбираем кодировку utf8mb4_unicode_ci
, почему ее? Можно прочитать тут: https://ru.stackoverflow.com/questions/757733/
Вот так, и тыкаем создать:
нам сообщат что база создана, теперь добавим в нее табличку
количество столбцов особенно ни на что не влияет, все равно потом можно добавить новые или убрать лишние.
в общем, когда все пропишете можно тыкать сохранить и приступить к заполнению:
вводим данные и тыкаем Вперед
получаем такой результат
снова тыкаем Вставить
и повторяем процедуру. В принципе нам хватит штук 5:
Для общения с базой данных в php встроен специальный класс PDO.
Через него можно подключаться к большинству популярных баз данных и выполнять разные запросы.
Чтобы начать общаться с базой, необходимо создать соединение. Делается это очень просто, идем в index.php
и пишем:
<?php
// ...
$controller = new Controller404($twig);
// создаем экземпляр класса и передаем в него параметры подключения
// создание класса автоматом открывает соединение
$pdo = new PDO("mysql:host=localhost;dbname=outer_space;charset=utf8", "root", "");
// дальше не трогаем
if ($url == "/") {
$controller = new MainController($twig);
} elseif (preg_match("#^/andromeda/image#", $url)) {
// ...
смысл значений такой:
Пробуем открыть главную страницу, если там ничего не поменялось, то значит подключились успешно:
а если подключение не сработает, то увидим какую-то ошибку, и тут надо уже разбираться по ситуации
в общем считаем что у нас все ок.
Чтобы из контроллера можно было бы обращаться к базе, добавим в BaseController
поле $pdo
и сеттер для него
<?php
abstract class BaseController {
public PDO $pdo; // добавил поле
public function setPDO(PDO $pdo) { // и сеттер для него
$this->pdo = $pdo;
}
// остальное не трогаем
public function getContext(): array {
return [];
}
abstract public function get();
}
и теперь добавим вызов этого метода перед вызовом get
<?php
// ...
// не трогаем тут
$pdo = new PDO("mysql:host=localhost;dbname=outer_space;charset=utf8", "root", "");
if ($url == "/") {
// ...
}
if ($controller) {
$controller->setPDO($pdo); // а тут передаем PDO в контроллер
$controller->get();
}
Давайте попробуем вывести данные из нашей таблички на главную страницу. Идем в MainController
<?php
require_once "TwigBaseController.php";
class MainController extends TwigBaseController {
public $template = "main.twig";
public $title = "Главная";
// добавим метод getContext()
public function getContext(): array
{
$context = parent::getContext();
// подготавливаем запрос SELECT * FROM space_objects
// вообще звездочку не рекомендуется использовать, но на первый раз пойдет
$query = $this->pdo->query("SELECT * FROM space_objects");
// стягиваем данные через fetchAll() и сохраняем результат в контекст
$context['space_objects'] = $query->fetchAll();
return $context;
}
}
теперь пойдем в main.php
и посмотрим, что оказалось в space_objects
. Добавим туда:
{% block content %}
<pre>
{{ dump(space_objects) }} <!-- добавил вывод данных -->
</pre>
<ul class="list-group">
<!-- ... -->
</ul>
{% endblock %}
правда если теперь запустить страницу, то увидим ошибку
тут дело в том, что в twig есть debug режим, который по умолчанию отключен и доступен только если активировать его вручную. И специальная функция dump доступна только в этом режиме.
Поэтому нам надо его сначала включить. Делается это достаточно просто. Идем в index.php
<?php
// ...
$url = $_SERVER["REQUEST_URI"];
$loader = new \Twig\Loader\FilesystemLoader('../views');
$twig = new \Twig\Environment($loader, [
"debug" => true // добавляем тут debug режим
]);
$twig->addExtension(new \Twig\Extension\DebugExtension()); // и активируем расширение
обновляем страницу
о! данные пошли! =)
Вообще если на них посмотреть, то мы увидим:
Давай выведем название первого элемента:
{% extends "__layout.twig" %}
{% block content %}
Название: {{ space_objects[0].title }}
<!-- ... -->
получится так:
но вообще так как мы запросили список объектов то и для вывода имеет смысл выводить все элементы, причем делать через уже знакомый нам for:
{% extends "__layout.twig" %}
{% block content %}
{% for object in space_objects %}
Название: {{ object.title }} <br>
{% endfor %}
<!-- ... -->
и тогда получится уже так:
ну думаю идея понятна, теперь можно и задание поделать =)
Доработать приложение чтобы список на главной странице формировался на основании данных их БД.
Ссылки пока просто добавить, с пустыми href
. Добавить картинку. Переверстать на флексы, чтобы получилось как-то так: