Формат экзамена
| Параметр | Значение |
|---|---|
| Количество вопросов | 75 |
| Время | 90 минут (~72 секунды на вопрос) |
| Формат | Multiple choice (один или несколько ответов) |
| Проходной балл | ~70% (~53 правильных ответа) |
| Язык | Английский |
| Формат сдачи | Онлайн (proctored) или в центре |
Типы вопросов
- Single choice -- один правильный ответ из 4-5 вариантов
- Multiple choice -- несколько правильных ответов (указано количество)
- 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_tagvsshort_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()vsembed.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 мин): просмотреть ответы
Тактика ответов
- Читайте вопрос полностью -- часто ключ в последнем предложении
- Обратите внимание на "NOT" -- вопросы с отрицанием частые
- Количество ответов -- если указано "select 2", выберите именно 2
- Исключайте заведомо неверные -- сужает выбор
- Не меняйте ответ без веской причины -- первая интуиция часто верна
- Отмечайте сомнительные -- вернитесь позже
- Код в вопросах -- ищите синтаксические ловушки
Приоритеты подготовки
ВЫСОКИЙ приоритет (больше всего вопросов):
├── 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 |
Практика
- Создайте проект на Symfony 8.0 и реализуйте все основные компоненты
- Пишите тесты -- функциональные тесты с WebTestCase
- Настройте Security -- full authenticator с voters
- Используйте Messenger -- async обработка с retry
- Изучите 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 проверяет знание деталей. Недостаточно "уметь пользоваться" -- нужно знать точные имена классов, порядок аргументов, поведение по умолчанию. Читайте документацию внимательно, обращая внимание на примечания и предупреждения.
Удачи на экзамене!