Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 412новых вакансий за сутки·55 411вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 671
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 396 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python8 728
  • Облачные технологии6 606
  • QA вакансии2 165
  • Android1 317
  • Инженер данных878
  • Продакт-менеджер314

Разработка

  • iOS1 229
  • Backend вакансии1 210
  • AI вакансии545
  • Fullstack вакансии500
  • Frontend вакансии422
  • Mobile вакансии28

По стеку

  • Go5 192
  • Java3 112
  • Kotlin1 085
  • Node.js992
  • Rust846
  • .NET660
  • PHP319
  • C++266
  • C#208

DevOps и инфраструктура

  • Kubernetes3 904
  • Linux-инфраструктура2 843
  • DevOps вакансии2 684
  • Terraform / IaC2 162
  • Мониторинг и Observability1 062
  • CI/CD921
  • SRE303
  • Кибербезопасность31

Аналитика и данные

  • Аналитик данных537
  • Data Scientist445
  • Бизнес-аналитик402
  • Системный аналитик68

Другие направления

  • Проджект-менеджер103
  • UI/UX дизайн70
  • Ручное тестирование14

По регионам

  • Вакансии в США26 186
  • Вакансии в Европе10 369
  • Работа в России3 628
  • Вакансии в Канаде2 306

По формату

  • Удалённые вакансии43 484
  • Релокация в США26 186
  • Гибридная работа5 597
  • Офисная работа4 383

По уровню

  • Senior вакансии22 724
  • Middle вакансии11 726
  • Junior вакансии3 874

Сейчас нанимают

Все компании
  • Rakuten189 вакансий
  • Wise186 вакансий
  • ASML164 вакансии
  • Grab135 вакансий
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen26 вакансий
  • Monzo19 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме SymfonyВсе вопросы
SymfonyMiddleТеория

Что такое Symfony events и чем event listeners отличаются от subscribers?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Event Listener — отдельный класс с ручной регистрацией через тег в services.yaml; Event Subscriber реализует EventSubscriberInterface и объявляет все обрабатываемые события внутри себя, регистрируясь автоматически.

Event Listener

Listener — обычный PHP-класс с произвольным методом-обработчиком. Он регистрируется через конфигурацию сервиса с тегом kernel.event_listener.

<?php
// src/EventListener/ExceptionListener.php
namespace App\EventListener;

use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpFoundation\Response;

class ExceptionListener
{
    public function onKernelException(ExceptionEvent $event): void
    {
        $exception = $event->getThrowable();
        $response = new Response('Error: ' . $exception->getMessage(), 500);
        $event->setResponse($response);
    }
}
# config/services.yaml
services:
  App\EventListener\ExceptionListener:
    tags:
      - { name: kernel.event_listener, event: kernel.exception, method: onKernelException, priority: 10 }

Система событий в Symfony

Symfony реализует паттерн Observer через компонент EventDispatcher. Приложение генерирует события (объекты, наследующие Symfony\Contracts\EventDispatcher\Event), а слушатели реагируют на них. Это позволяет расширять поведение без изменения исходного кода.

Event Subscriber

Subscriber реализует интерфейс EventSubscriberInterface и объявляет все обрабатываемые события внутри себя через статический метод getSubscribedEvents(). Он автоматически регистрируется, если включён autoconfigure.

<?php
// src/EventSubscriber/AuthSubscriber.php
namespace App\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Http\Event\LoginSuccessEvent;

class AuthSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            KernelEvents::REQUEST => [['onKernelRequest', 20]],
            LoginSuccessEvent::class => 'onLoginSuccess',
        ];
    }

    public function onKernelRequest(RequestEvent $event): void
    {
        // логика на каждый запрос
    }

    public function onLoginSuccess(LoginSuccessEvent $event): void
    {
        $user = $event->getUser();
        // логика после входа
    }
}

Создание собственного события

<?php
// src/Event/OrderCreatedEvent.php
namespace App\Event;

use App\Entity\Order;
use Symfony\Contracts\EventDispatcher\Event;

class OrderCreatedEvent extends Event
{
    public const NAME = 'order.created';

    public function __construct(private readonly Order $order) {}

    public function getOrder(): Order
    {
        return $this->order;
    }
}
<?php
// В сервисе, где создаётся заказ
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;

class OrderService
{
    public function __construct(
        private readonly EventDispatcherInterface $dispatcher
    ) {}

    public function create(array $data): Order
    {
        $order = new Order($data);
        // ... сохранение
        $this->dispatcher->dispatch(new OrderCreatedEvent($order));
        return $order;
    }
}

Ключевые отличия

  • Listener: регистрируется в конфигурации; один класс — один или несколько методов; удобен для изолированных обработчиков.
  • Subscriber: самодостаточен, несёт конфигурацию внутри себя; подходит для группировки связанных обработчиков; автоматически подхватывается через autoconfigure.
  • Priority (приоритет) задаётся в обоих: в теге для listener или в массиве из getSubscribedEvents(); выше число — раньше выполнение.
  • Метод $event->stopPropagation() прерывает цепочку слушателей.

Подводные камни

  • Если не указать method в теге kernel.event_listener, Symfony ищет метод по имени события — легко ошибиться при нестандартных именах.
  • При отключённом autoconfigure: true subscriber не регистрируется автоматически: нужно явно добавить тег kernel.event_subscriber.
  • Приоритеты между listener и subscriber не нормализованы в одном месте — трудно предсказать порядок выполнения без явного аудита конфигурации.
  • Тяжёлая логика внутри listener на kernel.request замедляет каждый запрос, включая статику и healthcheck-эндпоинты.
  • Событие kernel.exception вызывается только при необработанных исключениях; ошибки внутри try/catch не попадут к слушателям.
  • Вызов $event->setResponse() в listener на kernel.view или kernel.exception полностью заменяет ответ — случайно перезаписать ответ другого listener легко.
  • Circular dependency: listener, зависящий от сервиса, который сам тригерит то же событие, вызывает бесконечный цикл или исключение Symfony DI.

Частые вопросы на собеседовании

  • Как Symfony обрабатывает защиту от CSRF?
  • Как устроен Dependency Injection container compile pass?
  • Как работает service container (контейнер dependency injection) в Symfony?
  • В каких backend-проектах Symfony является сильным выбором, а где лучше выбрать более простой или другой стек?

Типичные ошибки

  • Сводить events listeners subscribers к названию метода без lifecycle и failure path.
  • Игнорировать модель runtime: Symfony 7/8 строит request lifecycle вокруг HttpKernel, events, routing, controller resolver и response listeners.
  • Не отделять validation, authorization, transaction boundary и business logic.
  • Менять похожие API местами без учёта семантики ошибок и ownership.

Что проверяет интервьюер

  • Объясняет events listeners subscribers через конкретную точку lifecycle в Symfony.
  • Приводит корректный минимальный пример без вымышленных методов или callbacks.
  • Называет edge cases: пустые значения, ошибки, транзакции, безопасность или concurrency.

Как вы знаете этот вопрос?

Проверить себя по теме Symfony →

Источники

  • https://symfony.com/doc/current/event_dispatcher.html
  • https://symfony.com/doc/current/index.html
←Предыдущий вопросЧто такое Symfony forms и как создавать и валидировать форму?Следующий вопрос→В чём разница между `findOneBy()` и использованием DQL (Doctrine Query Language)?

Связанные темы

SymfonyBackend-Engineeringsymfony-ecosystem