Первая программа на Symfony
Play ITЗагрузка интерактивного демо…
Первая программа на Symfony
Где применяют Symfony
Symfony — зрелый PHP-фреймворк с компонентами, DI-контейнером и явной конфигурацией. Laravel быстрее даёт "сайт из коробки"; Symfony часто выбирают в enterprise и долгоживущих API.
Для первого знакомства — страница "Привет, {имя}" и JSON /api/hello: видны маршрут, контроллер и Twig.
Обзор: Symfony. База PHP: Первая программа на PHP. Composer: Composer - управление зависимостями в PHP.
Что получится
| URL | Результат |
|---|---|
/hello/World | HTML "Привет, World!" |
/api/hello | {"message":"Hello from Symfony API"} |
Термины Symfony
| Термин | Значение |
|---|---|
| Kernel | Ядро: конфиг, бандлы, обработка запроса |
| Контроллер | Класс, возвращающий Response |
| Twig | Шаблонизатор ({{ name }}) |
#[Route] | Маршрут над методом PHP |
| DI | Зависимости через конструктор автоматически |
| Document root | Только public/ открыт веб-серверу |
Требования
- PHP 8.2+
- Composer
- Symfony CLI (рекомендуется)
Создание проекта
symfony new symfony-hello --webapp
cd symfony-hello
Разбор:
symfony new symfony-hello --webapp— создаёт новый Symfony-проект с преднастроенным веб-набором пакетов.symfony-hello— имя каталога проекта; в нём появятсяsrc/,config/,public/,templates/.- Ключ
--webappвключает практичные стартовые зависимости для серверного HTML-приложения. cd symfony-hello— переход в корень проекта, где находятсяcomposer.jsonиbin/console.- После этой команды все последующие CLI-операции выполняются уже в контексте созданного приложения.
Без CLI:
composer create-project symfony/skeleton symfony-hello
cd symfony-hello
composer require webapp
Разбор:
composer create-project symfony/skeleton symfony-hello— устанавливает минимальный каркас Symfony через Composer.symfony/skeleton— облегченное стартовое ядро без расширенного веб-обвеса.composer require webapp— добавляет webapp-pack и подтягивает ключевые пакеты для обычного веб-проекта.- Такой путь полезен, если Symfony CLI не установлен или в команде стандартизирован запуск через Composer.
- В результате структура проекта совпадает с типичным Symfony-приложением и готова к добавлению контроллеров.
symfony server:start
# или
php -S 127.0.0.1:8000 -t public
Разбор:
symfony server:start— запускает локальный dev-сервер Symfony CLI с удобными настройками для фреймворка.php -S 127.0.0.1:8000 -t public— встроенный сервер PHP;-t publicзадаёт document root на публичную директорию.- Строка
# илипоказывает альтернативу: выбирается один из двух способов запуска. - Привязка к
127.0.0.1:8000ограничивает доступ локальной машиной, что подходит для разработки. - Оба варианта направляют запросы в
public/index.php, откуда стартует жизненный цикл Symfony.
Веб-сервер смотрит в public/ (public/index.php). Каталоги src/, config/, .env из браузера недоступны.
Контроллер
php bin/console make:controller HelloController
Разбор:
php bin/console— точка входа в CLI-инструменты Symfony.make:controller— генератор из MakerBundle для быстрого создания контроллера и шаблона.HelloController— имя класса; Symfony создаёт файлsrc/Controller/HelloController.php.- Команда ускоряет старт и задаёт базовую структуру метода-обработчика.
- После генерации код обычно дорабатывают вручную под конкретные маршруты и ответы.
src/Controller/HelloController.php:
Код ITЗагрузка примера кода…
Разбор:
namespace App\Controller;— пространство имён; автозагрузка PSR-4 связывает его сsrc/Controller.use ... Responseиuse ... Routeподключают классы ответа и атрибута маршрутизации.class HelloController extends AbstractController— наследование даёт хелперыrender()иjson().#[Route('/hello/{name}', ...)]— маршрут с параметром URL;requirementsограничивает формат,defaultsзадаёт значение по умолчанию.hello(string $name): Responseпринимает параметр маршрута, передаёт данные в Twig и возвращает HTML-ответ.render('hello/hello.html.twig', ['name' => $name])рендерит шаблон и прокидывает переменнуюname.#[Route('/api/hello', ... methods: ['GET'])]ограничивает API-метод только HTTP GET.apiHello()возвращает JSON через$this->json(...), что удобно для API-эндпоинтов.
Разбор атрибута маршрута
| Параметр | Смысл |
|---|---|
'/hello/{name}' | Сегмент {name} → аргумент $name |
name: 'app_hello' | Имя для path() в Twig |
requirements | Regex — кириллицу в path лучше в query |
defaults | /hello → имя World |
methods: ['GET'] | Только GET для API |
php bin/console debug:router
Разбор:
debug:routerвыводит зарегистрированные маршруты приложения.- В таблице видны путь, имя маршрута, разрешённые HTTP-методы и целевой контроллер.
- Команда помогает быстро проверить, что атрибут
#[Route(...)]действительно распознан. - При 404 это первый диагностический шаг: видно, совпадает ли URL и метод запроса.
- Полезно запускать после добавления новых маршрутов или рефакторинга контроллеров.
Шаблон Twig
templates/hello/hello.html.twig:
{% extends 'base.html.twig' %}
{% block title %}Привет{% endblock %}
{% block body %}
<h1>Привет, {{ name }}!</h1>
<p>Это ваша первая страница на Symfony.</p>
{% endblock %}
Разбор:
{% extends 'base.html.twig' %}— наследует базовый layout, чтобы не дублировать каркас страницы.{% block title %}— задаёт содержимое блока заголовка для этой страницы.{% block body %}— основная область контента, которую Twig подставляет в layout.{{ name }}— вывод переменной, переданной из контроллера; Twig экранирует HTML по умолчанию.- Такой подход разделяет ответственность: контроллер готовит данные, Twig отвечает за представление.
| Синтаксис | Смысл |
|---|---|
{% extends %} | Общий layout |
{% block body %} | Переопределяемая секция |
{{ name }} | Вывод с экранированием (XSS) |
Структура каталогов
| Путь | Назначение |
|---|---|
src/Controller/ | HTTP-обработчики |
src/Entity/ | Doctrine |
templates/ | Twig |
config/ | Сервисы, пакеты |
public/ | index.php |
var/ | Кэш, логи |
Как запрос доходит до контроллера
Разбор:
- Диаграмма показывает путь HTTP-запроса от клиента до финального HTML-ответа.
public/index.php— единая точка входа, где поднимается ядро Symfony.KernelиRouterопределяют, какой контроллер обработает конкретный URL.HelloController::helloготовит данные для шаблона и инициирует рендер.Twigформирует итоговую HTML-страницу, после чегоResponseотправляется в браузер.
Частые ошибки
| Симптом | Причина |
|---|---|
| 404 на все URL | Document root не public/ |
| Twig not found | Опечатка в пути шаблона |
| 500 после правок | php bin/console cache:clear |
Что попробовать
make:entity Note— Doctrine.GET /api/notes— JSON.- Сравнить с Laravel-счётчиком.
Дальше
- Security, API Platform;
- Справочник Symfony;
- деплой:
APP_ENV=prod, document root =public/.
Мини-расширение после первого запуска
После страницы приветствия полезно добавить небольшую практику с формой и сохранением данных.
Что сделать за 30 минут
- Создать сущность
Feedback. - Сделать форму с полями
nameиmessage. - Сохранить запись через Doctrine.
- Вернуть подтверждение в Twig.
Этот шаг закрепляет полный путь: маршрут → контроллер → валидация → БД → шаблон.
Команды, которые пригодятся в каждом проекте Symfony
php bin/console debug:container
php bin/console debug:event-dispatcher
php bin/console doctrine:migrations:status
php bin/console about
Разбор:
debug:containerпоказывает доступные сервисы DI-контейнера и их идентификаторы.debug:event-dispatcherвыводит события и подписчиков, что полезно для трассировки поведения приложения.doctrine:migrations:statusотображает состояние миграций: какие применены и какие ожидают запуска.aboutпечатает сводную информацию о проекте и окружении Symfony.- Набор команд закрывает типовые задачи диагностики — сервисы, события, база данных и окружение.
Эти команды ускоряют диагностику конфигурации и помогают быстро ориентироваться в новом коде.
Связанные материалы: Symfony, Laravel, PHPUnit.
Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.
В подборках
Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:
Первые шаги (маршрут подборки) — Первая программа на Laravel, Ktor — первая программа, Qt Quick — первая программа на QML, Compose Multiplatform — первая программа, Qt — первая программа, Spring Boot на Kotlin — первая программа.