Формат сертификационного экзамена
Сертификация Symfony -- один из наиболее сложных экзаменов в PHP-экосистеме. Он проверяет не поверхностное знание API, а глубокое понимание внутренних механизмов фреймворка.
| Параметр | Значение |
|---|---|
| Количество вопросов | 45 |
| Время | 90 минут (2 минуты на вопрос) |
| Проходной балл | ~70% (около 32 правильных ответа) |
| Формат вопросов | Множественный выбор (один или несколько правильных) |
| Язык | Английский |
| Прокторинг | Онлайн через веб-камеру |
На экзамене: Некоторые вопросы имеют НЕСКОЛЬКО правильных ответов. Если вопрос подразумевает несколько правильных вариантов, вам нужно выбрать ВСЕ правильные -- частичный ответ считается неверным.
Темы экзамена и их вес
Symfony 7.4 / 8.0 -- общие темы
| Тема | Примерный вес | Сложность |
|---|---|---|
| PHP и основы веба | 5% | Средняя |
| HTTP и HttpFoundation | 10% | Высокая |
| Routing | 8% | Высокая |
| Controllers | 8% | Средняя |
| Templating (Twig) | 7% | Средняя |
| Forms | 10% | Очень высокая |
| Validation | 8% | Высокая |
| Dependency Injection | 12% | Очень высокая |
| Security | 12% | Очень высокая |
| Console | 5% | Средняя |
| Automated Tests | 5% | Средняя |
| Miscellaneous | 10% | Высокая |
Отличия Symfony 8.0 vs 7.4
Symfony 8.0 -- мажорный релиз, удаливший все deprecated-функции из 7.x. На экзамене 8.0 вы столкнётесь с вопросами, где старый API больше не работает.
<?php
declare(strict_types=1);
// Symfony 7.4 -- deprecated, но работает:
// EventSubscriberInterface ещё доступен
// Symfony 8.0 -- ТОЛЬКО #[AsEventListener]:
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
#[AsEventListener(event: RequestEvent::class, priority: 10)]
final readonly class MyListener
{
public function __invoke(RequestEvent $event): void
{
// Logic here
}
}
Ключевые изменения Symfony 8.0 для экзамена:
| Что убрано в 8.0 | Что использовать вместо |
|---|---|
EventSubscriberInterface |
#[AsEventListener] атрибут |
AbstractController::getParameter() |
#[Autowire('%param%')] |
TreeBuilder без getRootNode() |
Только getRootNode() |
| Старые Guard-аутентификаторы | Новая система Authenticators |
ContainerAwareCommand |
Обычный DI через конструктор |
kernel.event_listener tag вручную |
#[AsEventListener] атрибут |
AbstractType::setDefaultOptions() |
configureOptions() |
| Старые имена security-ролей | IS_AUTHENTICATED_FULLY и т.д. |
На экзамене: Если вы сдаёте экзамен на Symfony 8.0, помните -- ВСЕ deprecated-методы из 7.x удалены. Ответ, использующий deprecated API, автоматически неверен.
Стратегия подготовки
Распределение времени на экзамене
45 вопросов / 90 минут = 2 минуты на вопрос
Рекомендация:
- Первый проход (60 минут): отвечать на все вопросы, отмечая сомнительные
- Второй проход (25 минут): вернуться к отмеченным вопросам
- Третий проход (5 минут): проверить все ответы
Типичные ловушки экзамена
- Порядок имеет значение -- firewall rules, access_control, event listeners
- Default vs explicit -- что происходит, если не указать параметр
- Deprecation -- код работает, но deprecated (на 7.4 -- правильный ответ, на 8.0 -- нет)
- Несколько правильных ответов -- нужно выбрать ВСЕ
- Название классов -- полные имена классов (FQCN) могут быть похожи
- Конфигурация YAML vs PHP -- разный синтаксис, одинаковый результат
План подготовки на 4 недели
| Неделя | Фокус | Часы |
|---|---|---|
| 1 | DI Container, HTTP, Routing | 10-12 |
| 2 | Security, Forms, Validation | 10-12 |
| 3 | Twig, Console, Events, Messenger | 8-10 |
| 4 | Пробные экзамены, слабые места | 10-12 |
Ресурсы для подготовки
- Официальная документация -- основной источник (symfony.com/doc)
- Исходный код Symfony -- для понимания внутренних механизмов
- SymfonyCasts -- видеокурсы с разбором тем
- Пробные экзамены -- тренировка в формате реального экзамена
Топ ошибок на экзамене
1. Путаница между компонентами
<?php
declare(strict_types=1);
// HttpFoundation -- НЕ HttpKernel!
use Symfony\Component\HttpFoundation\Request; // HttpFoundation
use Symfony\Component\HttpKernel\HttpKernelInterface; // HttpKernel
// Security Core -- НЕ Security HTTP!
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface; // Core
use Symfony\Component\Security\Http\Authenticator\AuthenticatorInterface; // HTTP
2. Невнимательность к формулировке
Вопрос "Какой метод вызывается ПЕРВЫМ?" и "Какой метод вызывается при УСПЕШНОЙ аутентификации?" -- это разные вопросы!
3. Незнание значений по умолчанию
# Что происходит если не указать autowire?
services:
_defaults:
autowire: true # <-- Это в стандартном services.yaml
autoconfigure: true
# Этот сервис наследует autowire: true от _defaults
App\Service\MyService: ~