Перейти к основному содержимому

Первая программа на Symfony

Разработчику Архитектору

Play ITЗагрузка интерактивного демо…


Первая программа на Symfony

Где применяют Symfony

Symfony — зрелый PHP-фреймворк с компонентами, DI-контейнером и явной конфигурацией. Laravel быстрее даёт "сайт из коробки"; Symfony часто выбирают в enterprise и долгоживущих API.

Для первого знакомства — страница "Привет, {имя}" и JSON /api/hello: видны маршрут, контроллер и Twig.

Обзор: Symfony. База PHP: Первая программа на PHP. Composer: Composer - управление зависимостями в PHP.


Что получится

URLРезультат
/hello/WorldHTML "Привет, World!"
/api/hello{"message":"Hello from Symfony API"}

Термины Symfony

ТерминЗначение
KernelЯдро: конфиг, бандлы, обработка запроса
КонтроллерКласс, возвращающий Response
TwigШаблонизатор ({{ name }})
#[Route]Маршрут над методом PHP
DIЗависимости через конструктор автоматически
Document rootТолько public/ открыт веб-серверу

Требования


Создание проекта

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
requirementsRegex — кириллицу в 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 на все URLDocument root не public/
Twig not foundОпечатка в пути шаблона
500 после правокphp bin/console cache:clear

Что попробовать

  1. make:entity Note — Doctrine.
  2. GET /api/notes — JSON.
  3. Сравнить с Laravel-счётчиком.

Дальше


Мини-расширение после первого запуска

После страницы приветствия полезно добавить небольшую практику с формой и сохранением данных.


Что сделать за 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 — первая программа.