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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python8 801
  • Облачные технологии6 644
  • QA вакансии2 164
  • Android1 318
  • Инженер данных868
  • Продакт-менеджер314

Разработка

  • iOS1 230
  • Backend вакансии1 212
  • AI вакансии548
  • Fullstack вакансии499
  • Frontend вакансии423
  • Mobile вакансии28

По стеку

  • Go5 235
  • Java3 133
  • Kotlin1 120
  • Node.js1 004
  • Rust852
  • .NET659
  • PHP319
  • C++268
  • C#207

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

  • Kubernetes3 909
  • Linux-инфраструктура2 843
  • DevOps вакансии2 677
  • Terraform / IaC2 175
  • Мониторинг и Observability1 072
  • CI/CD915
  • SRE305
  • Кибербезопасность33

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

  • Аналитик данных532
  • Data Scientist435
  • Бизнес-аналитик400
  • Системный аналитик68

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

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

По регионам

  • Вакансии в США25 825
  • Вакансии в Европе10 301
  • Работа в России3 618
  • Вакансии в Канаде2 268

По формату

  • Удалённые вакансии42 661
  • Релокация в США25 825
  • Гибридная работа5 655
  • Офисная работа4 428

По уровню

  • Senior вакансии22 630
  • Middle вакансии11 534
  • Junior вакансии3 862

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

Все компании
  • Rakuten189 вакансий
  • Wise187 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis47 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

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

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

Что такое Symfony HttpKernel и как он обрабатывает запрос?

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

HttpKernel обрабатывает запрос через цепочку событий: kernel.request (роутинг/auth), kernel.controller, kernel.controller_arguments, вызов контроллера, kernel.view, kernel.response и kernel.terminate после отправки ответа.

Схема обработки запроса

Request
  └── kernel.request        # аутентификация, locale, роутинг
        └── kernel.controller  # resolve controller callable
              └── kernel.controller_arguments  # ParamConverter, ValueResolver
                    └── Controller::action()   # бизнес-логика
                          └── kernel.view      # если вернули не Response
                                └── kernel.response  # модификация заголовков, Set-Cookie
                                      └── kernel.finish_request
                                            └── kernel.terminate  # после flush (logging, async)

Symfony HttpKernel: жизненный цикл запроса

HttpKernel — это сердце Symfony. Он принимает объект Request и возвращает Response, используя цепочку событий (Event Dispatcher). Весь Symfony-фреймворк — это лишь набор EventListener'ов, зарегистрированных на события ядра.

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

  • kernel.request — приходит самым первым. RouterListener слушает это событие и добавляет атрибуты роутинга (_controller, _route) в Request. FirewallListener проверяет аутентификацию.
  • kernel.controller — ControllerResolver уже определил контроллер. Можно подменить его через $event->setController().
  • kernel.controller_arguments — ArgumentValueResolver'ы разрешают аргументы метода: #[MapRequestPayload], #[CurrentUser], Entity по ID и т.д.
  • kernel.view — если контроллер вернул не Response, а массив или DTO, ViewHandler (например, из FOSRestBundle) конвертирует его в Response.
  • kernel.response — финальная обработка ответа: добавление Cache-Control, CORS-заголовков, установка cookie.
  • kernel.terminate — выполняется после отправки ответа клиенту (fastcgi_finish_request). Используется для отложенного логирования и очередей.
  • kernel.exception — перехватывает любое непойманное исключение и конвертирует в Response через ExceptionListener.

Исходный код HttpKernel::handle()

<?php
// Упрощённый вариант Symfony\Component\HttpKernel\HttpKernel::handle()
public function handle(Request $request, int $type = self::MAIN_REQUEST, bool $catch = true): Response
{
    try {
        return $this->handleRaw($request, $type);
    } catch (\Throwable $e) {
        if (!$catch) {
            throw $e;
        }
        return $this->handleThrowable($e, $request, $type);
    }
}

private function handleRaw(Request $request, int $requestType): Response
{
    // 1. kernel.request
    $event = new RequestEvent($this, $request, $requestType);
    $this->dispatcher->dispatch($event, KernelEvents::REQUEST);
    if ($event->hasResponse()) {
        return $this->filterResponse($event->getResponse(), $request, $requestType);
    }

    // 2. Resolve controller
    $controller = $this->resolver->getController($request);

    // 3. kernel.controller
    $event = new ControllerEvent($this, $controller, $request, $requestType);
    $this->dispatcher->dispatch($event, KernelEvents::CONTROLLER);
    $controller = $event->getController();

    // 4. kernel.controller_arguments
    $arguments = $this->argumentResolver->getArguments($request, $controller);
    $event = new ControllerArgumentsEvent($this, $controller, $arguments, $request, $requestType);
    $this->dispatcher->dispatch($event, KernelEvents::CONTROLLER_ARGUMENTS);

    // 5. Call controller
    $response = $controller(...$event->getArguments());

    // 6. kernel.view (если не Response)
    if (!$response instanceof Response) {
        $event = new ViewEvent($this, $request, $requestType, $response);
        $this->dispatcher->dispatch($event, KernelEvents::VIEW);
        $response = $event->getResponse();
    }

    // 7. kernel.response
    return $this->filterResponse($response, $request, $requestType);
}

Sub-requests

HttpKernel поддерживает вложенные запросы (sub-request) — это основа для ESI и функции {{ render(controller('App\Controller\WidgetController::index')) }} в Twig. Каждый sub-request проходит весь цикл событий заново.

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

<?php
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;

#[AsEventListener(event: KernelEvents::REQUEST, priority: 20)]
class LocaleListener
{
    public function __invoke(RequestEvent $event): void
    {
        if (!$event->isMainRequest()) {
            return; // Пропустить sub-requests
        }
        $request = $event->getRequest();
        $locale = $request->cookies->get('locale', 'en');
        $request->setLocale($locale);
    }
}

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

  • kernel.terminate работает только при использовании FastCGI или специального терминируемого runner'а — в обычном PHP-FPM он выполняется синхронно и задерживает ответ.
  • Приоритеты листенеров: RouterListener имеет приоритет 32, FirewallListener — 8; если ваш листенер обращается к _route-атрибутам, его приоритет должен быть ниже 32.
  • Проверка $event->isMainRequest() обязательна в листенерах, которые не должны срабатывать для sub-requests (ESI, forward).
  • ExceptionListener вызывает handle() рекурсивно с $catch = false — бесконечная рекурсия возможна, если обработчик исключений сам бросает исключение.
  • kernel.view диспатчится только если контроллер вернул не Response; если вернул null — будет TypeError, а не ViewEvent.
  • #[AsEventListener] требует Symfony 6.0+; в более старых версиях нужна ручная регистрация через services.yaml с тегом kernel.event_listener.

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

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

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

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

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

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

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

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

Источники

  • https://symfony.com/doc/current/components/http_kernel.html
  • https://symfony.com/doc/current/index.html
←Предыдущий вопросПроект на Symfony вырос из MVP в большой production-сервис. Какие проблемы архитектуры и сопровождения вы ожидаете увидеть?Следующий вопрос→Что такое компонент Symfony Serializer и как его использовать?

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

SymfonyBackend-Engineeringsymfony-ecosystem