8 вопросов
HttpKernel - ядро Symfony, обрабатывает HTTP-запрос по событиям:
kernel.request - роутинг, аутентификацияkernel.controller - определение контроллераkernel.controller_arguments - резолвинг аргументовkernel.view - если контроллер вернул не Responsekernel.response - модификация ответаkernel.terminate - после отправки ответаПри исключении: kernel.exception. Event-driven архитектура позволяет расширять поведение без изменения ядра.
// Событие
class UserRegisteredEvent {
public function __construct(public User $user) {}
}
// Listener
#[AsEventListener]
class SendWelcomeEmailListener {
public function __invoke(UserRegisteredEvent $event): void {
$this->mailer->send($event->user->email, 'Welcome!');
}
}
// Dispatch
$dispatcher->dispatch(new UserRegisteredEvent($user));Event Dispatcher реализует паттерн Observer. В Symfony используется повсюду: HttpKernel, Form, Security, Console.
DI Container - компилируемый контейнер зависимостей с autowiring:
# services.yaml
services:
_defaults:
autowire: true
autoconfigure: true
App\:
resource: '../src/'Autowiring - автоматическое разрешение зависимостей по type hint. Контейнер анализирует конструкторы и подставляет нужные сервисы. Контейнер компилируется в PHP-класс для максимальной производительности.
Messenger - компонент для асинхронной обработки сообщений (аналог Laravel Queues):
// Message
class SendNotification {
public function __construct(public int $userId, public string $text) {}
}
// Handler
#[AsMessageHandler]
class SendNotificationHandler {
public function __invoke(SendNotification $msg): void {
$this->notifier->send($msg->userId, $msg->text);
}
}
// Dispatch
$bus->dispatch(new SendNotification(42, 'Hello'));Транспорты: AMQP (RabbitMQ), Redis, Doctrine, Amazon SQS, Kafka. Поддерживает middleware, retry, dead letter queue.
Twig - шаблонизатор Symfony: безопасный, быстрый, расширяемый.
{# Переменные #}
{{ user.name }}
{{ user.name|upper }}
{# Условия #}
{% if user.isAdmin %}
<span>Admin</span>
{% endif %}
{# Циклы #}
{% for post in posts %}
<h2>{{ post.title }}</h2>
{% endfor %}
{# Наследование #}
{% extends 'base.html.twig' %}
{% block content %}...{% endblock %}Twig автоматически экранирует вывод (защита от XSS). Компилируется в PHP для производительности.
Symfony Flex - Composer plugin, автоматизирующий установку и настройку бандлов. При composer require Flex: скачивает пакет, применяет "рецепт" (recipe) - создает конфигурационные файлы, добавляет env-переменные, регистрирует бандл.
composer require mailer # алиас для symfony/mailer
# Flex автоматически:
# - Создает config/packages/mailer.yaml
# - Добавляет MAILER_DSN в .env#[AsCommand(name: 'app:import-users', description: 'Import users from CSV')]
class ImportUsersCommand extends Command {
protected function execute(InputInterface $input, OutputInterface $output): int {
$io = new SymfonyStyle($input, $output);
$io->title('Importing users...');
$io->progressStart(100);
// ...
$io->progressFinish();
$io->success('Imported 100 users');
return Command::SUCCESS;
}
}Symfony Console используется в Laravel (Artisan), Doctrine, PHPUnit и многих других проектах.
Laravel использует компоненты Symfony: HttpFoundation, Console, Routing, Mailer, Process. Symfony более модульный - можно использовать отдельные компоненты. Laravel более opinionated - четкая структура проекта.
Для enterprise/DDD часто выбирают Symfony. Для быстрой разработки - Laravel.