Hackathon на PHP: как не прогореть и сделать крутой проект за 24 часа
Хакатоны — это адреналин, бессонные ночи и магия кода. Когда ты сидишь с командой в коворкинге, вокруг шум, пицца стынет, а дедлайн неумолимо приближается, хочется иметь в рукаве козырь. И этот козырь — PHP.
Многие скептически фыркают: «PHP? Для хакатона? Это же прошлый век!». Но на самом деле, современный PHP (7.4+, 8.x) — это ракета. Быстрый старт, куча готовых библиотек, минимум шаманства с сервером. Пока команда на Python будет настраивать виртуальное окружение, ты уже напишешь первый эндпоинт. В этой статье я расскажу, как использовать PHP на хакатоне, чтобы не просто доползти до финиша, а реально удивить жюри.
Почему PHP — идеальный язык для хакатона?
Давайте честно: на хакатоне время — единственная валюта. У тебя нет недели на рефакторинг и выбор идеального паттерна. Тебе нужно работающее демо. PHP в этом плане — король:
- Zero configuration. Поставил XAMPP / OpenServer / Docker — и погнал. Не нужно компилировать, ждать билда.
- Огромный Composer. Нужен парсер Excel?
phpoffice/phpspreadsheet. Нужен API?slim/slimилиlaravel/lumen. Всё уже написано до тебя. - Простота хостинга. Выкатил на любой shared-хостинг за 5 минут. Жюри не нужно ставить Node.js или Python — PHP есть везде.
- Быстрый прототип БД. PDO и MySQL — стандарт. Нет ORM-монстров, если не хочешь.
Но есть и подводные камни. PHP легко скатиться в «говнокод». На хакатоне это простительно, но если ты хочешь победить, нужно держать баланс между скоростью и читаемостью. Давайте разберем стратегию.
Фаза 1: Выбор идеи и стека (первые 30 минут)
Самая частая ошибка новичков — начать кодить сразу, как только услышали тему. Не делай так. Первые полчаса — это мозговой штурм и выбор инструментов.
Какую идею выбрать?
- Решайте реальную проблему. Жюри устало от «очередного TODO-листа». Сделайте сервис для поиска потерянных вещей в университете или телеграм-бота для записи к врачу.
- MVP — это не весь проект. Вы должны показать одну killer-фичу, но идеально. Лучше работающий чат на 2 пользователя, чем неработающий мессенджер с 10 функциями.
- Используйте данные. Если есть открытое API (погода, биржи, университетское расписание) — берите его. Парсинг + визуализация выглядят солидно.
Стек для быстрого старта
Забудьте про Laravel для хакатона — он слишком тяжелый и требует много конфигурации. Идеальный выбор:
- Микрофреймворк Slim 4 — легкий, быстрый, идеален для REST API.
- Шаблонизатор Twig — если нужен фронт (но лучше отдавать JSON + Vue/React на фронте).
- SQLite — не надо поднимать MySQL. Одна файловая база — и всё работает.
- Tailwind CSS — для минимального фронта, чтобы не писать CSS вручную.
Фаза 2: Архитектура за 15 минут (не пропускай!)
Бери лист бумаги (или доску) и нарисуй 3 блока:
- Как пользователь вводит данные?
- Что происходит на сервере?
- Что видит пользователь?
Пример для сервиса опросов в реальном времени:
- Пользователь создает опрос → POST запрос в
/api/poll. - Другие голосуют → GET
/api/poll/{id}с результатами. - Обновление через WebSocket (или тупой poll через JS setInterval).
На этом этапе вы уже понимаете, какие маршруты (routes) вам нужны. В Slim это выглядит так:
<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
require __DIR__ . '/../vendor/autoload.php';
$app = AppFactory::create();
// Маршрут для создания опроса
$app->post('/api/poll', function (Request $request, Response $response) {
$data = $request->getParsedBody();
// Валидация и запись в БД
$response->getBody()->write(json_encode(['status' => 'ok']));
return $response->withHeader('Content-Type', 'application/json');
});
// Маршрут для получения результатов
$app->get('/api/poll/{id}', function (Request $request, Response $response, $args) {
$pollId = $args['id'];
// Достаем из БД
$response->getBody()->write(json_encode(['id' => $pollId, 'votes' => 42]));
return $response->withHeader('Content-Type', 'application/json');
});
$app->run();
Видите? 20 строк — и у вас уже два работающих эндпоинта. Никаких контроллеров, сервисов и DI-контейнеров — только хардкор. На хакатоне это нормально.
Фаза 3: Работа с базой данных без боли
Не пишите сырые SQL-запросы в каждом обработчике — это ад. Используйте PDO с простым классом-оберткой. Вот пример, который спасет вам часы:
<?php
class Database {
private static ?PDO $instance = null;
public static function getInstance(): PDO {
if (self::$instance === null) {
self::$instance = new PDO('sqlite:' . __DIR__ . '/../data/hack.db');
self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
self::$instance->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
}
return self::$instance;
}
public static function init(): void {
$db = self::getInstance();
$db->exec("CREATE TABLE IF NOT EXISTS polls (
id INTEGER PRIMARY KEY AUTOINCREMENT,
question TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)");
$db->exec("CREATE TABLE IF NOT EXISTS votes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
poll_id INTEGER NOT NULL,
option TEXT NOT NULL,
FOREIGN KEY (poll_id) REFERENCES polls(id)
)");
}
}
// Инициализация при старте приложения
Database