Fabien Potencier, ментейнер Symfony несколько дней назад представил черновую версию гайда лучшх практик, для разработки приложений с использованием Symfony, как фреймворка (напомню, что также это набор независимых компонентов).
Мы знаем, как сложно отучиться от старых привычек и некоторые советы шокируют вас, но следуя им вы сможете разрабатывать приложения быстрее, сделать их менее сложными и в то же время более качественными.
В любом случае стоит помнить, что это всего лишь рекомендации и ваша команда не обязана им следовать. Вы можете продолжать использовать свои подходы, Symfony достаточно гибок для любых нужд и это никогда не изменится.
Под катом я выписал основные тезисы, большинство из них подробно аргументируется внутри книги, в некоторых «шокирующих» местах помимо тезиса есть небольшое объяснение.
- Всегда используйте Composer для установки Symfony.
- Создавайте только один бандл для логики приложения. Бандл — независимый компонент, который в дальнейшем можно переиспользовать. Например вашем приложении есть UserBundle и ProductBundle. Скорее всего ProductBundle не будет корректно работать без UserBundle, а это не правильно.
- Параметры среды(база данных, логи) и приложения опишите в файле
app/config/parameters.yml
. - Параметры среды и приложения по умолчанию опишите в
app/config/parameters.yml.dist
. - Не меняющиеся параметры опишите в константах (прямо в
app/config/parameters.yml
). - Названия ваших сервисов должны быть как можно более коротки и просты, в идеале это должно быть одно слово (например slugger, geocoder).
- Для определения сервисов приложения используйте YAML.
- Используя Doctrine ORM, определяйте схему с помощью аннотаций. Все форматы конфигурации имеют одинаковую производительность.
- Контроллеры приложения должны наследовать
SymfonyBundleFrameworkBundleControllerController
, использовать аннотации для роутинга и кеширования, когда это возможно. - Не используйте аннотацию
@Template()
для настройки шаблона, используемого контроллером. Аннотация полезна, но работает «магически», поэтому рекомендуется ее не использовать. Также использование этой аннотации замедляет ваше приложение на 21мс. - Используйте автоматическую конвертацию параметров, когда это полезно и удобно
/** * @Route("/{id}", name="admin_post_show") */ public function showAction(Post $post)
- Для шаблонизации используйте Twig.
- Храните ваши шаблоны в директории
app/Resources/views/
. - Для каждой формы создавайте класс.
- Добавляйте кнопки в шаблоне, а не в PHP коде.
- Для переводов используйте формат XLIFF.
- Храните файлы переводов в
app/Resources/translations/
. - Всегда используйте ключевые слова для перевода, вместо текста. Например не
Username
, аlabel.username
. - Если ваше приложение имеет два варианта авторизации, рекомендуется использовать один firewall, с включенным параметром
anonymous
. - Используйте алгоритм
bcrypt
для хеширования пользовательских паролей. - Для автоматической проверки прав доступа по URL используйте
access_control
. Когда возможно, используйте аннотацию@Security
. В более сложных ситуациях используйте сервисsecurity.context
. - Храните статику(ассеты) в директории
web/
. - Используйте Assetic для обработки статики, или другие подобные инструменты, например GruntJS.
- При использовании фронтенд-фреймворков, таких как AngularJS, вы должны отделить фронтенд и бекенд на два проекта.
- Пишите как минимум функциональные тесты для проверки, что страницы приложения успешно загружаются. Хардкодьте URL страницы, вместо использования
UrlGenerator
.
Автор: hell0w0rd