- Создать БД 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 и индексы по частым запросам.
- Логирование и унифицированная обработка исключений.