Symfony

8 вопросов

1 Что такое Symfony HttpKernel?

HttpKernel - ядро Symfony, обрабатывает HTTP-запрос по событиям:

  1. kernel.request - роутинг, аутентификация
  2. kernel.controller - определение контроллера
  3. kernel.controller_arguments - резолвинг аргументов
  4. Вызов контроллера
  5. kernel.view - если контроллер вернул не Response
  6. kernel.response - модификация ответа
  7. kernel.terminate - после отправки ответа

При исключении: kernel.exception. Event-driven архитектура позволяет расширять поведение без изменения ядра.

Открыть отдельно →
2 Что такое Event Dispatcher?
// Событие
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.

Открыть отдельно →
3 Что такое Symfony DI container?

DI Container - компилируемый контейнер зависимостей с autowiring:

# services.yaml
services:
    _defaults:
        autowire: true
        autoconfigure: true
    App\:
        resource: '../src/'

Autowiring - автоматическое разрешение зависимостей по type hint. Контейнер анализирует конструкторы и подставляет нужные сервисы. Контейнер компилируется в PHP-класс для максимальной производительности.

Открыть отдельно →
4 Что такое Symfony Messenger?

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.

Открыть отдельно →
5 Что такое Twig?

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 для производительности.

Открыть отдельно →
6 Что такое Symfony Flex?

Symfony Flex - Composer plugin, автоматизирующий установку и настройку бандлов. При composer require Flex: скачивает пакет, применяет "рецепт" (recipe) - создает конфигурационные файлы, добавляет env-переменные, регистрирует бандл.

composer require mailer  # алиас для symfony/mailer
# Flex автоматически:
# - Создает config/packages/mailer.yaml
# - Добавляет MAILER_DSN в .env
Открыть отдельно →
7 Что такое Symfony Console?
#[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 и многих других проектах.

Открыть отдельно →
8 Чем Symfony отличается от Laravel?
  • Symfony: набор компонентов, конфигурация через YAML/XML, Doctrine (Data Mapper), больше boilerplate, лучше для enterprise
  • Laravel: full-stack framework, конфигурация через PHP, Eloquent (Active Record), менее verbose, лучший DX

Laravel использует компоненты Symfony: HttpFoundation, Console, Routing, Mailer, Process. Symfony более модульный - можно использовать отдельные компоненты. Laravel более opinionated - четкая структура проекта.

Для enterprise/DDD часто выбирают Symfony. Для быстрой разработки - Laravel.

Открыть отдельно →
🧠Квиз 🏆Лидеры 🎯Собесед. 📖Вопросы 📚База зн.