Что мы знаем о Symfony: мифы и легенды

Когда веб-разработчика спрашивают о Symfony, у него в голове, как правило, рисуется определенная картина, некое устоявшееся мнение. Что можно сказать о Symfony в одном предложении? Это full-stack веб-фреймворк, написанный на PHP. Всё так, но это не совсем точное определение. Понятие Symfony несколько шире стандартного понимания.

Symfony — это набор автономных компонентов. В свою очередь компоненты, связываясь между собой, образуют веб-платформу, своеобразную экосистему. При этом то, какие компоненты выбирать, зависит от вас и ваших задач. Вы также можете воспользоваться минимальным набором для создания простого приложения или прототипа или же развернуть тот самый полнофункциональный фреймворк Symfony.

Ребята из Noveo пообщались со своими PHP-разработчиками и выделили общие ключевые моменты, которые были отмечены, и задались вопросом, действительно ли всё так хорошо / плохо, как говорят. Так получилась эта подборка мифов и легенд о Symfony.

Низкая связность компонентов

Модульность — одна из наиболее важных особенностей работы с Symfony. Как уже было отмечено выше, Symfony являет собой набор переиспользуемых и автономных компонентов — бандлов. В Symfony всё есть бандл, и всё живёт в бандлах — и компоненты ядра фреймворка, и код вашего приложения. Такое архитектурное решение предоставляет возможность строить приложение очень гибко. Шаг за шагом вы строите свою структуру — по кирпичику, таким образом ваше приложение уже не монолитная стена, и, чтобы заменить какой-то модуль, вам не нужно рушить всё приложение. Причём конечную конфигурацию, разумеется, можно настроить «под себя». Более того, вы можете использовать отдельные компоненты Symfony вне фреймворка. Данным подходом успешно пользуются и другие проекты, например, Laravel, Drupal, Magento и многие другие.

Отдельно следует отметить поддержку Dependency Injection в Symfony как одну из главных фич фреймворка. Использование DI снижает связность и упрощает тестируемость кода.

В Symfony много готовых решений

Это действительно так — решения есть для самых разнообразных задач, от повседневных до экзотических. На сегодняшний день существует более 2500 бандлов, каждый из которых вы можете подключить и использовать — спасибо модульности. Если по каким-то причинам один из бандлов не подходит, его можно заменить на аналогичный, благо выбрать есть из чего. Или же, одновременно исправив фатальный недостаток и исполнив заветную мечту программиста, написать свой — такой же, но другой. Пожалуй, здорово иметь возможность переиспользования готовых компонентов и сторонних библиотек и в то же время не быть прибитым гвоздями к конкретной технологии или инструменту.

Symfony сложный

Symfony слишком сложный. Отчасти это так — у Symfony более высокий порог вхождения по сравнению с другими PHP-фреймворками. Соответственно, и времени на его освоение требуется гораздо больше. Новичкам придется непросто. Здесь и использование инновационных возможностей языка, и применение паттернов проектирования. Нужно быть готовым к тому, что изучением только Symfony дело не ограничится. В придачу следует ознакомиться с технологиями и инструментами, которые идут рука об руку с Symfony и позволят использовать его максимально продуктивно: Twig, SwiftMailer, Monolog, phpUnit, Doctrine, а также наиболее популярные бандлы, например, FOS, Knp, Gedmo и др.

Symfony спроектирован очень грамотно

Symfony отличается выстроенной концепцией и идеологией, но важно понимать, что он не даёт готового и единственно правильного решения при разработке проекта. Задача построения конечной архитектуры приложения (не забываем уважать стандарты) целиком и полностью делегируется разработчику и остается на его совести. Отсюда можно выделить два следствия, которые перекликаются с предыдущим пунктом: опытный Symfony-разработчик с большей степенью вероятности обладает глубокими знаниями языка в частности и навыками проектирования в целом. Второй, не столь жизнерадостный момент: найти грамотных Symfony-разработчиков сложнее, а воспитание собственных требует времени.

Symfony делает вас свободными

Считаете, что подключили бандлы и можно работать? Секундочку, не всё так просто. Поскольку фреймворк гибкий, то и возможностей для его настройки много. Конфиги и аннотации — наше всё. В стандартной поставке фреймворка базовые конфигурационные файлы уже присутствуют. Однако разработчики Symfony не ограничиваются yaml-файлами. Для конфигурирования приложения или отдельных его частей предоставлена возможность использовать аннотации, конфиги в виде xml- или php-файлов. Единого стиля нет, и каждый использует тот способ, который представляется наиболее удобным. Конечно, по многим моментам есть рекомендации, что использовать в той или иной ситуации, но это не накладывает на разработчиков дополнительных ограничений, они вправе самостоятельно делать выбор.

Что это — свобода или хаос? Данную ситуацию можно развернуть в любую сторону. Всё достаточно просто. Предоставляя людям выбор, вы возлагаете на них ответственность. Очевидно, что при безалаберном использовании приложение легко превратится в лоскутное одеяло, а качество продукта не будет высоким. Правильным решением будет ещё до начала активной стадии разработки договориться внутри команды о подходе к конфигурированию приложения и описанию кода. Общение — ключ к успеху.

Symfony подходит только для крупных проектов

Сложный вопрос. Symfony, если мы говорим о full-stack фреймворке, хорош для относительно крупных проектов. Пожалуй, следует согласиться с тем, что Symfony — не всегда лучший выбор для небольших проектов за несколькими исключениями. Первое —  он может быть использован, если требуется решать сравнительно типовые задачи, а выигрыш за счёт быстрого старта и использования стандартных бандлов значителен. Однако в данном случае к выбору следует подходить осознанно, взвесив все преимущества и проблемы, с которыми, возможно, придётся столкнуться. Использование Symfony для мелкого API (можно посмотреть в сторону микро-фреймворков, например, тот же Silex) или простенького сайта можно сравнить с поездкой за продуктами на фуре-длинномере — да, едет, но медленнее и дороже в сравнении с легковыми. Второе исключение — использование Symfony «на вырост» в перспективе расширения проекта и его масштабируемости. В любом случае, инструмент следует выбирать исходя из задач, а не наоборот.

Symfony медленный

Я бы не назвал Symfony медленным. В рамках этой статьи мы не будем производить замеры производительности, у нас нет такой задачи, но думаю, не составит большого труда найти самые разнообразные бенчмарки php-фреймворков. Глядя на их результаты, становится ясно, что быстродействие Symfony на достойном уровне, хотя он и не является фаворитом в плане производительности, существуют более быстрые фреймворки. Важно понимать, почему так происходит. Все плюшки, которые мы получаем от работы с Symfony, требуют ресурсов, да и абстракция не бесплатна. За всё нужно платить, и в программировании за удобство, качество и скорость разработки зачастую приходится платить производительностью.

Здесь сразу возникает холиварный вопрос: что имеет бОльшую цену — стоимость разработки или стоимость хостинга? На мой взгляд, легче добавить сервер, тем самым повысив производительность приложения, чем найти и добавить нового разработчика на проект. Разумеется, это абсолютно не означает, что не нужно задумываться об оптимизации продукта и конечном быстродействии. Нужно, и очень важно всегда принимать во внимание данный аспект. Не открою Америки, если скажу, что оптимизация производительности не является лёгкой задачей. Для её решения следует понимать, что происходит внутри, и в деталях представлять, что может привести к замедлению и каким образом справляться с нагрузками.

Слишком много магии

Зачастую приходится слышать, что в Symfony очень много магии и не всегда понятно, что откуда получается и самое главное — как работает. Не могу полностью согласиться с этим. В Symfony магии не больше, чем в других фреймворках. Вообще использование любого фреймворка связано с некоторым уровнем «магии». И это нормально, одна из задач фреймворка — упрощать решение часто повторяющихся задач . Когда вы начинаете работать с фреймворком, вы используете примеры документации, готовые рецепты. При этом некоторые моменты могут быть не столь очевидны, могут быть непонятны, мы часто называем это магией. Вы используете магию фреймворка, и вроде бы всё хорошо. В определённый момент вы чувствуете недостаток стандартных возможностей фреймворка и рецептов, приходит время создать свою «магию». Создавая свою магию, вы разбираетесь в том, как на самом деле работает фреймворк, и в этот самый момент эта часть перестает для вас быть чёрным ящиком, и эта функциональность перестаёт для вас быть магией. Так происходит освоение фреймворка. Не нужно бояться того, что вы сразу не понимаете всех деталей.

Мощное сообщество

Пожалуй, этот аргумент можно услышать в разговоре о практически любом более-менее популярном фреймворке или языке программирования. Каждый убеждён, что сообщество масштабное, крайне дружелюбное, отзывчивое и готово причинять добро каждому новичку. Как бы это ни звучало банально, но сообщество Symfony на самом деле масштабное. Большое количество разработчиков на github и stackoverflow, которые отвечают на вопросы (в том числе core-разработчики и разработчики бандлов). При этом общение не является односторонним, любой желающий может создавать pull-request’ы, вносить предложения, создавать свои бандлы. Любителям живого общения следует отметить, что сообществом регулярно проводятся конференции как международные, так и национальные.

Поддержка и финансирование

Еще один важный момент для open-source проекта, который не всегда выделяют — поддержка коммерческой компании, в данном случае — SensioLabs. Компания предлагает дополнительные услуги, такие как консалтинг, обучение, различные сертификации. Это придает дополнительную уверенность в плане стабильности проекта, в дальнейшем росте и развитии экосистемы фреймворка.

Хорошая документация

Нельзя не отметить высокий уровень документации, она актуальна для каждой версии фреймворка, описывает не только компоненты, но и наиболее популярные бандлы. До недавнего времени на официальном сайте можно было найти книгу по практическому применению Symfony, список рецептов и лучшие практики по использованию фреймворка. К 5-летию второй версии фреймворка создатели решили основательно переработать документацию, создав два раздела: Getting started — короткая книга по основам работы с фреймворком и Guides — руководства по отдельным темам. К сожалению, все обозначенные выше материалы не доступны на русском языке, и этот факт можно отметить как дополнительный барьерчик для новичков, но не стоит пугаться — документация довольно хорошо структурирована, написана понятным и простым языком, содержит примеры кода и в ней достаточно легко разобраться.

Symfony не ограничивает вас в выборе, он предоставляет свободу действий, но в то же время требует детального понимания принципов работы и возлагает ответственность за построение структуры приложения.

Вся суть аннотаций Symfony в одном контроллере:

/**
 * @Route("/{id}/", requirements={"id":"\d+"})
 * @Method("GET")
 * @Rest\View(statusCode=200, serializerEnableMaxDepthChecks=true, serializerGroups={"details"})
 * @ParamConverter("user", class="AppBundle:User")
 * @ApiDoc(
 *   description="Fetch info of a user",
 *   requirements={
 *      {
 *          "name"="id",
 *          "dataType"="integer",
 *          "requirement"="\d+",
 *          "description"="User id"
 *      }
 *   },
 *   resource=true,
 *   section="User"
 * )
 */
public function getUserAction(User $user)
{
    return $user;
}


За материал выражаем благодарность международной IT-компании Noveo.