Советы при разработке проекта на 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-installcomposer'а то, что там не нужно! - Не используйте системный временный каталог
/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.
Спасибо Роману за хороший доклад!