HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Репозитории, которыми мы пользовались в уроках этого курса, хранят свои данные в сессии. Это было удобно для того, чтобы не отвлекаться на взаимодействие с базой и сфокусироваться на особенностях работы веба.</p>
1 <p>Репозитории, которыми мы пользовались в уроках этого курса, хранят свои данные в сессии. Это было удобно для того, чтобы не отвлекаться на взаимодействие с базой и сфокусироваться на особенностях работы веба.</p>
2 <p>Теперь мы привыкли к фреймворку и понимаем принципы создания приложений на нем, поэтому можно начинать работу с реальной базой данных.</p>
2 <p>Теперь мы привыкли к фреймворку и понимаем принципы создания приложений на нем, поэтому можно начинать работу с реальной базой данных.</p>
3 <p>Чтобы начать хранить и извлекать данные из базы, нам нужно выполнить несколько действий:</p>
3 <p>Чтобы начать хранить и извлекать данные из базы, нам нужно выполнить несколько действий:</p>
4 <ul><li>Установить зависимости, необходимые для работы с базой данных</li>
4 <ul><li>Установить зависимости, необходимые для работы с базой данных</li>
5 <li>Настроить подключение к базе данных и дать к нему доступ из приложения</li>
5 <li>Настроить подключение к базе данных и дать к нему доступ из приложения</li>
6 <li>Создать начальную структуру базы данных с нужными таблицами</li>
6 <li>Создать начальную структуру базы данных с нужными таблицами</li>
7 <li>Переписать методы репозиториев так, чтобы они работали с данными через базу</li>
7 <li>Переписать методы репозиториев так, чтобы они работали с данными через базу</li>
8 </ul><p>В этом уроке мы проделаем все эти шаги на примере создания части CRUD для сущности Car с полями make (марка) и model (модель).</p>
8 </ul><p>В этом уроке мы проделаем все эти шаги на примере создания части CRUD для сущности Car с полями make (марка) и model (модель).</p>
9 <h2>Устанавливаем зависимости</h2>
9 <h2>Устанавливаем зависимости</h2>
10 <p>Для простоты мы будем использовать базу данных SQLite с хранением данных в файле. Этого достаточно для обучения, но в реальном окружении уже понадобится поставить PostgreSQL или его аналог.</p>
10 <p>Для простоты мы будем использовать базу данных SQLite с хранением данных в файле. Этого достаточно для обучения, но в реальном окружении уже понадобится поставить PostgreSQL или его аналог.</p>
11 <p>Чтобы начать работать, вам потребуется установить PDO и драйвер SQLlite. Сделать это можно по нашей<a>инструкции</a>. Чтобы подключится к другой базе данных, нужно будет по аналогии установить соответствующий драйвер</p>
11 <p>Чтобы начать работать, вам потребуется установить PDO и драйвер SQLlite. Сделать это можно по нашей<a>инструкции</a>. Чтобы подключится к другой базе данных, нужно будет по аналогии установить соответствующий драйвер</p>
12 <h2>Настраиваем подключение</h2>
12 <h2>Настраиваем подключение</h2>
13 <p>Рассмотрим такой пример</p>
13 <p>Рассмотрим такой пример</p>
14 <p>В примере выше мы создаем соединение с базой данных SQLlite с расположением в файле<em>database.sqlite</em>и регистрируем его в контейнере. Соединение потребуется нам при создании репозитория, так как вся работа с базой будет сосредоточена там.</p>
14 <p>В примере выше мы создаем соединение с базой данных SQLlite с расположением в файле<em>database.sqlite</em>и регистрируем его в контейнере. Соединение потребуется нам при создании репозитория, так как вся работа с базой будет сосредоточена там.</p>
15 <p>Файл базы данных<em>database.sqlite</em>, если еще не существует, будет создан автоматически при первом обращении к базе. Поскольку этот файл содержит все данные приложения, его следует добавить в<em>.gitignore</em>, чтобы он не попал в git-репозиторий.</p>
15 <p>Файл базы данных<em>database.sqlite</em>, если еще не существует, будет создан автоматически при первом обращении к базе. Поскольку этот файл содержит все данные приложения, его следует добавить в<em>.gitignore</em>, чтобы он не попал в git-репозиторий.</p>
16 <h2>Строим начальную структуру базы данных</h2>
16 <h2>Строим начальную структуру базы данных</h2>
17 <p>В нашем случае база данных создается при старте приложения, поэтому ее инициализацию мы будем делать там же, во время старта. Для этого создадим файл с нужной схемой данных и затем добавим ее в базу данных:</p>
17 <p>В нашем случае база данных создается при старте приложения, поэтому ее инициализацию мы будем делать там же, во время старта. Для этого создадим файл с нужной схемой данных и затем добавим ее в базу данных:</p>
18 <ol><li><p>Добавляем файл<em>init.sql</em>:</p>
18 <ol><li><p>Добавляем файл<em>init.sql</em>:</p>
19 </li>
19 </li>
20 <li><p>Загружаем схему в базу:</p>
20 <li><p>Загружаем схему в базу:</p>
21 </li>
21 </li>
22 </ol><h2>Создаем класс Car</h2>
22 </ol><h2>Создаем класс Car</h2>
23 <p>Для моделирования данных мы создадим класс,</p>
23 <p>Для моделирования данных мы создадим класс,</p>
24 <h2>Создаем репозиторий CarRepository</h2>
24 <h2>Создаем репозиторий CarRepository</h2>
25 <p>В репозитории нам понадобится соединение с базой данных, так как вся работа с базой будет сосредоточена тут. Соединение будет передаваться в конструктор при создании объекта репозитория. Обратите внимание, что мы указали тип для параметра конструктора. Это нужно для того, чтобы контейнер внедрения зависимостей понимал, что нам нужен именно объект класса \PDO для создания объекта репозитория.</p>
25 <p>В репозитории нам понадобится соединение с базой данных, так как вся работа с базой будет сосредоточена тут. Соединение будет передаваться в конструктор при создании объекта репозитория. Обратите внимание, что мы указали тип для параметра конструктора. Это нужно для того, чтобы контейнер внедрения зависимостей понимал, что нам нужен именно объект класса \PDO для создания объекта репозитория.</p>
26 <p>Принцип создания всех методов для работы с базой данных одинаковый:</p>
26 <p>Принцип создания всех методов для работы с базой данных одинаковый:</p>
27 <ul><li>Описываем шаблон запроса</li>
27 <ul><li>Описываем шаблон запроса</li>
28 <li>Формируем стейтмент</li>
28 <li>Формируем стейтмент</li>
29 <li>Делаем подстановки</li>
29 <li>Делаем подстановки</li>
30 <li>Выполняем запрос</li>
30 <li>Выполняем запрос</li>
31 <li>Собираем результат</li>
31 <li>Собираем результат</li>
32 <li>Возвращаем ответ</li>
32 <li>Возвращаем ответ</li>
33 </ul><h2>Рассматриваем примеры операций</h2>
33 </ul><h2>Рассматриваем примеры операций</h2>
34 <p>Структура контроллеров не меняется, несмотря на все изменения, которые мы сделали. Как видно на примере ниже, правильная организация абстракций и разделение по слоям приводят к тому, что изменение внутренностей не оказывает особого влияния на строение приложения:</p>
34 <p>Структура контроллеров не меняется, несмотря на все изменения, которые мы сделали. Как видно на примере ниже, правильная организация абстракций и разделение по слоям приводят к тому, что изменение внутренностей не оказывает особого влияния на строение приложения:</p>
35 <p>Контейнер внедрения зависимостей достаточно умный и может сам создать объект репозитория. Он использует информацию из конструктора класса, чтобы автоматически внедрить нужные зависимости, когда они требуются. Нам остается только запросить объект репозитория из контейнера:</p>
35 <p>Контейнер внедрения зависимостей достаточно умный и может сам создать объект репозитория. Он использует информацию из конструктора класса, чтобы автоматически внедрить нужные зависимости, когда они требуются. Нам остается только запросить объект репозитория из контейнера:</p>
36 <p>Когда мы запрашиваем объект из контейнера, контейнер видит, что CarRepository нуждается в PDO и автоматически создает экземпляр, передав ему соединение</p>
36 <p>Когда мы запрашиваем объект из контейнера, контейнер видит, что CarRepository нуждается в PDO и автоматически создает экземпляр, передав ему соединение</p>