MidПрактика2 min

Советы по экзамену

Формат экзамена, типы вопросов, частые подвохи, стратегия прохождения, ресурсы

Формат экзамена

Параметр Значение
Количество вопросов 75
Время 90 минут (~72 секунды на вопрос)
Формат Multiple choice (один или несколько ответов)
Проходной балл ~70% (~53 правильных ответа)
Язык Английский
Формат сдачи Онлайн (proctored) или в центре

Типы вопросов

  1. Single choice -- один правильный ответ из 4-5 вариантов
  2. Multiple choice -- несколько правильных ответов (указано количество)
  3. True/False -- утверждение верно или нет

Распределение вопросов по темам

Тема Примерный % Количество вопросов
PHP & HTTP 10% ~7
Architecture 10% ~7
Controllers 8% ~6
Routing 8% ~6
Twig 8% ~6
Forms 8% ~6
Validation 8% ~6
DI 10% ~7
Security 10% ~7
Messenger 5% ~4
Console 5% ~4
Testing 5% ~4
Miscellaneous 5% ~5

Частые подвохи (Exam Traps)

PHP и HTTP

Подвох: short_open_tag vs short_echo_tag. Короткий echo <?= доступен ВСЕГДА с PHP 5.4, независимо от short_open_tag в php.ini. Короткий тег <? зависит от настройки.

Подвох: HTTP-коды. 301 -- permanent redirect, 302 -- temporary redirect (found), 303 -- see other (POST->GET), 307 -- temporary redirect (сохраняет метод). Symfony использует 302 по умолчанию для redirectToRoute().

Routing

Подвох: Порядок маршрутов важен. Первый совпавший маршрут побеждает. Более специфичные маршруты должны быть определены ПЕРЕД общими.

Подвох: _format -- специальный параметр маршрута. Если установлен, Symfony автоматически устанавливает Content-Type ответа.

Twig

Подвох: Разница между {{ }} (вывод), {% %} (логика) и {# #} (комментарий). Символ | -- pipe для фильтров, . -- доступ к свойствам/методам.

Подвох: include() vs embed. include просто вставляет шаблон, embed позволяет переопределить блоки включённого шаблона.

Forms

Подвох: handleRequest() обрабатывает ТОЛЬКО POST-запросы (для форм по умолчанию). Для GET-запросов форма не будет submitted, даже если данные есть.

Подвох: isSubmitted() && isValid() -- ВСЕГДА проверяйте оба. isValid() без isSubmitted() вернёт false и не покажет ошибки валидации.

Validation

Подвох: #[Assert\Valid] нужен для каскадной валидации вложенных объектов. Без него вложенный объект НЕ будет валидирован.

Подвох: Validation groups. По умолчанию используется группа Default. Если указать группу явно, Default не включается автоматически (если не указана).

Dependency Injection

Подвох: Сервисы по умолчанию shared (singleton) и private. Нельзя получить private сервис через $container->get().

Подвох: Autowiring не работает при множественных реализациях интерфейса. Нужен alias или #[Autowire(service: ...)].

Подвох: При использовании конструктора в команде обязательно вызвать parent::__construct().

Security

Подвох: access_control -- порядок правил критичен. Первое совпадение побеждает. Более специфичные пути ПЕРВЫМИ.

Подвох: Стратегия voters по умолчанию -- affirmative. Один GRANT достаточен для доступа, даже если другие voters вернули DENY.

Подвох: stateless: true в firewall несовместим с remember_me и logout.

Подвох: PasswordHasher с алгоритмом auto выберет лучший доступный алгоритм. В тестах используйте plaintext для скорости.

Messenger

Подвох: Сообщение НЕ должно содержать entity объекты -- только ID. Entity не сериализуемы для async обработки.

Подвох: max_retries: 3 означает 4 попытки всего (1 оригинал + 3 retry).

Подвох: UnrecoverableExceptionInterface сразу отправляет в failure transport без retry.

Console

Подвох: interact() НЕ вызывается с флагом --no-interaction (-n). initialize() вызывается ВСЕГДА.

Подвох: Коды возврата: 0 = SUCCESS, 1 = FAILURE, 2 = INVALID.

Testing

Подвох: enableProfiler() нужно вызывать ПЕРЕД запросом, а не после.

Подвох: assertResponseIsSuccessful() проверяет 2xx коды. Для редиректа (3xx) используйте assertResponseRedirects().

HTTP Caching

Подвох: Cache-Control имеет приоритет над Expires. Если оба установлены, Cache-Control побеждает.

Подвох: no-cache НЕ означает "не кешировать". Это означает "всегда проверять у сервера" (validation). Для полного запрета кеша используйте no-store.

Стратегия прохождения

Распределение времени

75 вопросов за 90 минут = 72 секунды на вопрос

Рекомендуемая стратегия:
1. Первый проход (60 мин): ответить на все знакомые вопросы
2. Второй проход (20 мин): вернуться к отмеченным
3. Финальная проверка (10 мин): просмотреть ответы

Тактика ответов

  1. Читайте вопрос полностью -- часто ключ в последнем предложении
  2. Обратите внимание на "NOT" -- вопросы с отрицанием частые
  3. Количество ответов -- если указано "select 2", выберите именно 2
  4. Исключайте заведомо неверные -- сужает выбор
  5. Не меняйте ответ без веской причины -- первая интуиция часто верна
  6. Отмечайте сомнительные -- вернитесь позже
  7. Код в вопросах -- ищите синтаксические ловушки

Приоритеты подготовки

ВЫСОКИЙ приоритет (больше всего вопросов):
├── DI (autowiring, tags, decoration)
├── Security (voters, firewalls, authenticators)
├── Architecture (kernel events, request handling)
└── PHP (enums, readonly, closures)

СРЕДНИЙ приоритет:
├── Forms (types, validation, data transformers)
├── Routing (requirements, defaults, host)
├── Twig (filters, functions, inheritance)
├── Validation (constraints, groups, custom)
└── Controllers (responses, request attributes)

НИЖНИЙ приоритет (меньше вопросов):
├── Messenger (basics, retry)
├── Console (commands, events)
├── Testing (WebTestCase, Crawler)
└── Miscellaneous (Cache, Serializer, Translation)

Ресурсы для подготовки

Официальная документация

Ресурс URL
Symfony Documentation symfony.com/doc/current
Best Practices symfony.com/doc/current/best_practices.html
Components symfony.com/doc/current/components
Certification Page certification.symfony.com

Практика

  1. Создайте проект на Symfony 8.0 и реализуйте все основные компоненты
  2. Пишите тесты -- функциональные тесты с WebTestCase
  3. Настройте Security -- full authenticator с voters
  4. Используйте Messenger -- async обработка с retry
  5. Изучите DI -- теги, декоратор, compiler pass

Чек-лист готовности

  • Могу создать контроллер с маршрутами через #[Route]
  • Понимаю lifecycle запроса (kernel events)
  • Умею настраивать Security (firewalls, voters, authenticators)
  • Знаю autowiring, tags, decoration, compiler passes
  • Могу создать форму с кастомным типом и трансформером
  • Понимаю validation groups и каскадную валидацию
  • Умею настраивать Messenger (transports, retry, failure)
  • Знаю Twig: наследование, include/embed, фильтры
  • Могу писать функциональные тесты с Crawler
  • Понимаю HTTP-кеширование (Cache-Control, ETag)
  • Знаю Cache, Serializer, Mailer, Translation
  • Понимаю разницу между Sf7.4 и Sf8.0

Последний совет

Сертификационный экзамен Symfony проверяет знание деталей. Недостаточно "уметь пользоваться" -- нужно знать точные имена классов, порядок аргументов, поведение по умолчанию. Читайте документацию внимательно, обращая внимание на примечания и предупреждения.

Удачи на экзамене!