Советы при разработке проекта на Symfony 2
...по мотивам доклада Романа Лапина на конференции PHP Frameworks Day 2013 - "Как превратить проект на Symfony 2 в боль". С некоторыми ошибками ведения проекта на Symfony 2 скорее всего вы уже сталкивались в процессе разработки первого проекта или в самом начале изучения этого фреймворка. Добрую часть ошибок я допускал при первом знакомстве с Symfony 2, но все же доклад стоит посмотреть.
Роман Лапин - Как превратить проект на Symfony 2 в боль
Собственно - советы:
- Добавьте в
.gitignore
на системном уровне каталог.idea/
, файлы*.DS_Store
,*.iml
; - Не забывайте в каждом проекте добавлять в
.gitignore
следующие файлы:vendors/
,parameters.yml
; - Не меняйте дефолтную структуру файлов и каталогов без крайней необходимости!
- Окружение не должно зависеть от "машины", на которой вы запускаете проект. Окружение - это определенная конфигурация проекта в момент его запуска. Если конфигурация зависит от машины - используйте свой локальный
app/config/parameters.yml
который нужно добавите в.gitignore
; - Также не завязывайте приложение на конкретное окружение в коде! Не нужно проверять окружение в самом коде - лучше использовать параметры предопределенные для нужного окружения.
- Не изменяйте исходный код в каталоге
vendors/
! Воспринимайтеvendors/
как черный ящик. Ваше приложение должно знать только о файле автозагрузки -vendor/autoload.php
. При необходимости используйтеnamespace
для подмены пути к переопределенному классу; - Не добавляйте в
.gitignore
файлcomposer.lock
- вам нужно знать историю работоспособной связки всех зависимостей; - Не делайте
composer update
на продакшене! На локалке лучше обновлять зависимости пошагово и прогонять тесты (надеюсь они у вас есть) после обновления нужной зависимости; - Не суньте в
post-install
composer'а то, что там не нужно! - Не используйте системный временный каталог
/tmp
для логов/кеша - у каждого проекта на Symfony 2 должен быть отдельный каталог для логов и кеша; - Не нужно без крайней необходимости инжектить
@service_container
в каждую зависимость, ведь можно заинжектить только конкретные необходимые для каждого класса зависимости (если их не вагончик); - Вместо инжекта в класс
@security_context
для определения прав доступа, проверьте права в контроллере и выполните нужное/доступное действие. Так вы сможете использовать этот класс в консоли, которая ничего не знает по@security_context
; - Не используйте
ACL
. Она довольно сложна и может вызвать нежелательную нагрузку. Используйте Voters:
Voters также упростит последующие модификации прав доступа.$this->sc->isGranted(...);
- Вычищайте все лишнее после кодо-генерации контроллеров!
- Будьте вежливыми - используйте фикс код стайла:
bin/php-cs-fixer fix src
- Помните о нежелательных:
- Fat Controllers - контроллер должен выполнять самый минимум действий: принял запрос, инициализировал сервис, вызвал метод, отдал ответ;
- Tight Coupling;
- Code Immobility;
- Заведите README.md!
- ...продолжаем делать проекты на Symfony 2 лучше
Оставляйте замечания и другие полезные советы или частые ошибки из вашей практики разработки на Symfony 2.
Спасибо Роману за хороший доклад!