Symfony для PHP: полное руководство с примерами

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Что такое Symfony и зачем он нужен?

Symfony — это мощный, зрелый и один из самых популярных компонентных фреймворков для языка PHP. Он предназначен для создания веб-приложений, от небольших сайтов до сложных корпоративных систем. В отличие от монолитных фреймворков, Symfony построен на принципе модульности: он состоит из набора независимых, хорошо документированных и переиспользуемых компонентов (библиотек). Вы можете использовать как весь фреймворк целиком, так и отдельные его компоненты (например, только компонент HTTP-запроса или маршрутизации) в любом другом PHP-проекте.

Зачем он нужен?

  • Ускорение разработки: Symfony предоставляет готовые решения для типовых задач: маршрутизация, работа с базами данных (через Doctrine ORM), шаблонизация (Twig), аутентификация, обработка форм, кэширование и многое другое. Вам не нужно изобретать велосипед.
  • Структурированность и поддерживаемость: Фреймворк навязывает четкую архитектуру (MVC — Model-View-Controller), что делает код организованным, предсказуемым и легким для поддержки другими разработчиками.
  • Надежность и безопасность: Symfony имеет встроенные механизмы защиты от распространенных уязвимостей (CSRF, XSS, SQL-инъекции). Он используется в таких гигантах, как Drupal, phpBB и многих корпоративных проектах.
  • Сообщество и экосистема: Огромное сообщество, тысячи готовых бандлов (расширений), отличная документация и долгосрочная поддержка (LTS-версии).
  • Гибкость: Вы можете начинать с микро-фреймворка (Symfony MicroKernel) для API и постепенно подключать нужные компоненты по мере роста проекта.

Установка Symfony

В отличие от Python (где используется pip), в PHP для управления зависимостями используется Composer. Установка Symfony состоит из двух этапов: установка самого установщика (Symfony CLI) и создание проекта.

1. Установка Composer

Если у вас еще нет Composer, скачайте и установите его с официального сайта getcomposer.org. Это глобальный инструмент для PHP.

# Проверка установки Composer
composer --version

2. Установка Symfony CLI (рекомендуется)

Symfony CLI — это удобный инструмент для создания, управления и запуска проектов.

# Установка на macOS/Linux (через curl)
curl -sS https://get.symfony.com/cli | bash

# Установка на Windows (через Chocolatey)
choco install symfony-cli

# Проверка
symfony --version

3. Создание нового проекта

Используйте команду symfony new для создания скелета приложения.

# Создание полного веб-приложения (с Symfony Flex)
symfony new my_project --full

# Создание микро-приложения (для API)
symfony new my_api_project

Если вы не хотите устанавливать CLI, можно использовать Composer напрямую:

composer create-project symfony/skeleton:"7.0.*" my_project
# Или для полного приложения:
composer create-project symfony/website-skeleton:"7.0.*" my_project

Быстрый старт с примером кода

Давайте создадим простую страницу "Hello, World!" с помощью Symfony.

1. Создаем контроллер

Контроллер — это PHP-класс, который обрабатывает запрос и возвращает ответ. Создайте файл src/Controller/HelloController.php:

<?php
// src/Controller/HelloController.php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class HelloController extends AbstractController
{
    #[Route('/hello/{name}', name: 'hello_page')]
    public function index(string $name): Response
    {
        // Рендерим шаблон Twig
        return $this->render('hello/index.html.twig', [
            'name' => $name,
        ]);
    }
}

2. Создаем шаблон Twig

Создайте файл templates/hello/index.html.twig:

{# templates/hello/index.html.twig #}
{% extends 'base.html.twig' %}

{% block title %}Hello {{ name }}!{% endblock %}

{% block body %}
    <h1>Hello, {{ name }}! Welcome to Symfony.</h1>
    <p>This is your first Symfony page.</p>
{% endblock %}

3. Запускаем сервер

# Запуск встроенного веб-сервера Symfony
symfony server:start

# Или используя PHP напрямую
php -S 127.0.0.1:8000 -t public

4. Открываем в браузере

Перейдите по адресу http://127.0.0.1:8000/hello/World. Вы увидите страницу с заголовком "Hello, World!".

Основные методы и функции Symfony (8-10 штук)

Symfony — это огромный фреймворк. Мы рассмотрим ключевые методы из самых популярных компонентов.

1. AbstractController::render() (рендеринг шаблона)

Что делает: Этот метод является основным для отображения HTML-страниц. Он берет имя шаблона Twig, передает в него переменные и возвращает объект Response с готовым HTML.

Параметры:

  • string $view: Путь к шаблону (например, 'product/index.html.twig').
  • array $parameters = []: Ассоциативный массив переменных, которые будут доступны в шаблоне.
  • Response $response = null: Необязательный объект Response для настройки заголовков.

Пример:

<?php
public function showProduct(int $id): Response
{
    $product = ['name' => 'Laptop', 'price' => 1200];
    return $this->render('product/show.html.twig', [
        'product' => $product,
        'pageTitle' => 'Product Details',
    ]);
}

2. Request::createFromGlobals() (работа с HTTP-запросом)

Что делает: Статический фабричный метод компонента HttpFoundation. Он создает объект Request, который инкапсулирует все данные из глобальных переменных PHP ($_GET, $_POST, $_COOKIE, $_SERVER и т.д.). Это основной способ взаимодействия с входящим запросом.

Параметры: Не принимает параметров (использует глобальные переменные).

Пример:

<?php
use Symfony\Component\HttpFoundation\Request;

// В контроллере или сервисе:
public function handleForm(Request $request): Response
{
    // Получаем GET параметр 'page'
    $page = $request->query->get('page', 1);

    // Получаем POST данные
    $username = $request->request->get('username');

    // Получаем заголовок
    $userAgent = $request->headers->get('User-Agent');

    // Проверяем, является ли запрос AJAX
    if ($request->isXmlHttpRequest()) {
        // ...
    }
    return new Response('OK');
}

3. Response::__construct() (создание ответа)

Что делает: Создает объект HTTP-ответа. Это основа для отправки данных клиенту (HTML, JSON, файлы, редиректы).

Параметры:

  • string $content = '': Тело ответа (HTML, JSON строка).
  • int $status = 200: HTTP статус-код (200, 404, 500 и т.д.).
  • array $headers = []: Массив HTTP-заголовков.

Пример:

<?php
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;

// Простой HTML ответ
$html = '<h1>Page Not Found</h1>';
return new Response($html, 404, ['Content-Type' => 'text/html']);

// JSON ответ для API
$data = ['status' => 'success', 'data' => ['id' => 5]];
return new JsonResponse($data, 201); // 201 Created

4. UrlGeneratorInterface::generate() (генерация URL)

Что делает: Генерирует абсолютный или относительный URL на основе имени маршрута (route name). Это критически важно для поддержки сайта: если вы измените путь в маршруте, все ссылки, сгенерированные через этот метод, обновятся автоматически.

Параметры:

  • string $name: Имя маршрута (задается в атрибуте #[Route]).
  • array $parameters = []: Параметры маршрута (например, ['slug' => 'my-post']).
  • int $referenceType = UrlGeneratorInterface::ABSOLUTE_PATH: Тип ссылки (относительный, абсолютный).

Пример:

<?php
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;

class BlogController extends AbstractController
{
    public function showPost(string $slug, UrlGeneratorInterface $urlGenerator): Response
    {
        // Генерируем ссылку на главную страницу
        $homeUrl = $urlGenerator->generate('app_homepage');

        // Генерируем ссылку на редактирование поста (абсолютную)
        $editUrl = $urlGenerator->generate('admin_post_edit', [
            'id' => 5
        ], UrlGeneratorInterface::ABSOLUTE_URL);

        // В шаблоне Twig можно использовать функцию path():
        // <a href="{{ path('app_homepage') }}">Home</a>
        return $this->render('blog/show.html.twig', [
            'edit_url' => $editUrl,
        ]);
    }
}

5. EntityManagerInterface::persist() и flush() (работа с Doctrine ORM)

Что делает: Это основные методы для сохранения объектов в базу данных через Doctrine ORM. persist() говорит Doctrine "следить за этим объектом", а flush() выполняет все накопленные SQL-запросы (INSERT, UPDATE, DELETE) в одной транзакции.

Параметры:

  • persist(object $entity): Принимает объект сущности (Entity).
  • flush(): Не принимает параметров.

Пример:

<?php
use App\Entity\Product;
use Doctrine\ORM\EntityManagerInterface;

class ProductController extends AbstractController
{
    public function createProduct(EntityManagerInterface $entityManager): Response
    {
        $product = new Product();
        $product->setName('Keyboard');
        $product->setPrice(99.99);

        // Говорим Doctrine "сохранить этот объект позже"
        $entityManager->persist($product);

        // Выполняем SQL запрос (INSERT)
        $entityManager->flush();

        return new Response('Saved new product with id '.$product->getId());
    }
}

6. EntityManagerInterface::getRepository() (поиск данных)

Что делает: Возвращает репозиторий для конкретной сущности.

Рекомендаций