Советы при разработке проекта на Symfony 2

Категория: Symfony2

...по мотивам доклада Романа Лапина на конференции PHP Frameworks Day 2013 - "Как превратить проект на Symfony 2 в боль". С некоторыми ошибками ведения проекта на Symfony 2 скорее всего вы уже сталкивались в процессе разработки первого проекта или в самом начале изучения этого фреймворка. Добрую часть ошибок я допускал при первом знакомстве с Symfony 2, но все же доклад стоит посмотреть.

Роман Лапин - Как превратить проект на Symfony 2 в боль

Собственно - советы:

  1. Добавьте в .gitignore на системном уровне каталог .idea/, файлы *.DS_Store,  *.iml;
  2. Не забывайте в каждом проекте добавлять в .gitignore следующие файлы: vendors/,  parameters.yml;
  3. Не меняйте дефолтную структуру файлов и каталогов без крайней необходимости!
  4. Окружение не должно зависеть от "машины", на которой вы запускаете проект. Окружение - это определенная конфигурация проекта в момент его запуска. Если конфигурация зависит от машины - используйте свой локальный app/config/parameters.yml  который нужно добавите в .gitignore;
  5. Также не завязывайте приложение на конкретное окружение в коде! Не нужно проверять окружение в самом коде - лучше использовать параметры предопределенные для нужного окружения.
  6. Не изменяйте исходный код в каталоге vendors/! Воспринимайте vendors/ как черный ящик. Ваше приложение должно знать только о файле автозагрузки - vendor/autoload.php. При необходимости используйте namespace для подмены пути к переопределенному классу;
  7. Не добавляйте в .gitignore файл composer.lock - вам нужно знать историю работоспособной связки всех зависимостей;
  8. Не делайте composer update на продакшене! На локалке лучше обновлять зависимости пошагово и прогонять тесты (надеюсь они у вас есть) после обновления нужной зависимости;
  9. Не суньте в post-install composer'а то, что там не нужно!
  10. Не используйте системный временный каталог /tmp для логов/кеша - у каждого проекта на Symfony 2 должен быть отдельный каталог для логов и кеша;
  11. Не нужно без крайней необходимости инжектить @service_container в каждую зависимость, ведь можно заинжектить только конкретные необходимые для каждого класса зависимости (если их не вагончик);
  12. Вместо инжекта в класс @security_context для определения прав доступа, проверьте права в контроллере и выполните нужное/доступное действие. Так вы сможете использовать этот класс в консоли, которая ничего не знает по @security_context;
  13. Не используйте ACL. Она довольно сложна и может вызвать нежелательную нагрузку. Используйте Voters:
    $this->sc->isGranted(...);
    Voters также упростит последующие модификации прав доступа.
  14. Вычищайте все лишнее после кодо-генерации контроллеров!
  15. Будьте вежливыми - используйте фикс код стайла:
    bin/php-cs-fixer fix src
  16. Помните о нежелательных:
    1. Fat Controllers - контроллер должен выполнять самый минимум действий: принял запрос, инициализировал сервис, вызвал метод, отдал ответ;
    2. Tight Coupling;
    3. Code Immobility;
  17. Заведите README.md!
  18. ...продолжаем делать проекты на Symfony 2 лучше

Оставляйте замечания и другие полезные советы или частые ошибки из вашей практики разработки на Symfony 2.

Спасибо Роману за хороший доклад!

категория: Symfony2