- Создать БД
taskappи таблицу:
CREATE DATABASE taskapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE taskapp;
CREATE TABLE tasks (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
completed TINYINT(1) NOT NULL DEFAULT 0
);- Проверить доступы MySQL-пользователя (подключение, права
INSERT/SELECT).
- Добавить
config.php, который возвращает ассоциативный массив ['db' =>
['user'=>'имя пользователя бд', 'dsn'=>'адрес бд', 'pass'=>'пароль бд', 'options'=>'дополнительные опции'],
'storage' => путь к storage/tasks.json,
'repository' => 'указать какой тип репозитория используется'
]
- Создать папку
storage/с правами на запись.
-
Обновить
App\Repository\TaskRepositoryInterface: -
findAll(): array -
add(App\Model\Task $task): void
-
Создать
App/Repository/FileTaskRepository.php. -
Реализовать:
-
findAll()— чтение JSON →Task[](учесть пустой/битый файл). -
add()— добавление записи и сохранение JSON. -
Сериализация в UTF-8,
JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT.
-
Создать
App/Repository/MySqlTaskRepository.php. -
Конструктор принимает
PDO(ERRMODE_EXCEPTION,utf8mb4). -
Реализовать:
-
findAll()—SELECT title, completed FROM tasks ORDER BY id DESC. -
add()—INSERTчерез подготовленное выражение.
-
Зарегистрировать в контейнере:
-
PDO -
FileTaskRepository -
MySqlTaskRepository -
Привязка
TaskRepositoryInterface→ реализация поconfig['repository']. -
Обновить
index.phpдля загрузки конфига и регистрации сервисов.
-
TaskController::add(): -
GET — вывод формы (
<input name="title">). -
POST — валидация,
repository->add(), редирект на?route=task/list. -
В
View/task_list.php— ссылка «Добавить задачу». -
Убедиться, что список использует репозиторий из контейнера.
- Режим
file: добавление/чтение вstorage/tasks.json. - Режим
mysql: добавление/чтение из таблицыtasks. - Негативные кейсы: отсутствующий/повреждённый JSON, недоступная БД.
- Интерфейс обновлён и используется контроллером.
- Оба репозитория корректно работают (одинаковое поведение).
- Переключение реализаций через конфиг/ENV.
- Добавление задач доступно в обоих режимах, без фатальных ошибок.
- В
FileTaskRepository— блокировкиflock()при записи. - Методы
toggleComplete()иdelete()в обоих репозиториях. - Пагинация в MySQL и индексы по частым запросам.
- Логирование и унифицированная обработка исключений.