Что выбрать для нового проекта, CMS на подобие Drupal, WordPress, Joomla или Framework, на подобие Laravel, Symfony, Yii и т.д. В чём отличие CMS от Framework? CMS — это готовый программный шаблон для создания сайта. А именно, он уже обладает богатым набором функционала из коробки: админка, система регистрации, авторизации и аутентификации; система ролей для пользователей и настройка прав; готовый шаблон с блоками и панелями; множество предустановленных модулей, которые позволяют получить богатый функционал: блоги, форумы, голосовалки, соц. сети, галереи, доски объявлений и т.д.
При этом можно создавать прямо из админки сайта новые страницы, поля для форм, целые разделы и типы данных, настраивать ссылки, алиасы и много вообще ещё чего. У каждой CMS есть свое огромное сообщество, которое каждый день выпускает новые решения, новые модули, шаблоны и другие интересные ништяки.
Казалось бы, вот он рай неземной. Но не всё так радостно, как может показаться. И чем более квалифицированный программист, чем больше у него опыта и знаний, тем меньше ему хочется работать с CMS.
Итак, обратная сторона красивой медали. А вот она уже очень некрасивая! Чтобы всё это буйство решений работало в одной связке, нужен очень строгий и типизированный механизм. А если конкретнее, то ядро системы должно иметь механизмы, позволяющие подключать разнообразные модули, которые будут сразу же работать после включения. А это означает, что структура модуля должна быть строго типизированная, конкретно под свой CMS.
И будет работать только под её управлением и только той версии, под которую написан этот модуль. Система хранения данных в базе уже определена, и поэтому необходимо следовать стандарту. Система шаблонов также строго типизирована. Для того, чтобы все красиво состыковывалось и работало, созданы системы таких жутких костылей, что иногда на это без слез смотреть нельзя.
Когда вы захотите получить для своего проекта функционал, которого не существует из коробки, то вам придется создавать свой модуль или модули. При этом вы неизбежно столкнётесь с тем, помимо того, что необходимо строго следовать стандарту конкретной CMS, что вам всё время придется придумывать костыли, чтобы обойти множество ненужных вещей, которые будет вам навязывать ядро.
Для примера, вы хотите убрать из какой-то формы регистрации часть описания, или изменить внешний вид поля, или изменить обработчик, на который нужно повесить свой дополнительный функционал. И вот тут вы начнете скакать на граблях. Любая кастомизация, в том числе и внешнего вида, принесёт вам очень много головной боли. Вы столкнётесь с тем, что в шаблон для рендера передается такое количество мусора, что не совсем понятно, почему он называется шаблоном. Перехват данных до вывода в шаблон, перехват данных после вывода в шаблон, перехват данных в момент создания формы и ещё сотни всяких приколов.
Вместо создания собственного функционала, вы будете большую половину времени тратить на борьбу с CMS, читать сутками мануалы, искать в интернете решение проблемы вылазящих ото всюду багов. Или как обойти то или иное ограничение. Вольётесь в сообщество и превратитесь в адепта системы. Другими словами, вы будете создават не свой код для себя и заказчика, а будете придумывать 1000 + 1 способ, как обойти ограничения или избыточность CMS.
Что же такое Framework?
А это уже полуфабрикат, который представляет из себя только набор минимально необходимого функционала, который реализовывает ряд популярных паттернов. Например, MVC, который уже по умолчанию является стандартом при создании сайтов. Как правило, из коробки нет ничего. Но зато у вас в руках появляется мощный инструмент. Вы можете создать такую архитектуру проекта, которую хотите. Создать структуру базы данных именно так, как необходимо.
В шаблон вы выводите только то, что вам нужно, а сам шаблон — это действительно шаблон, а не каша из php и html кода. Все настройки храните в файлах, а не в базе. Ваш проект легко переносить из одного сервера на другой. В наличии всегда миграции, которые позволят развернуть проект с нуля за пару минут в любом месте. Все маршруты к страницам хранятся в файле роутов, а не в базе.
Другими словами, вы полностью сосредотачиваетесь на процессе разработки и осуществления задумок. Сам framework не будет вас заставлять делать только так или этак. Но придется следовать определенным правилам, которые логичны, адекватны и помогают улучшить и код, и структуру приложения.
Помимо этого, для фреймворков существуют свои готовые решения для конкретных задач, которые можно установить через composer. Очень часто можно адаптировать решения от одного фреймворка к другому. К примеру, бандлы от Симфони присутствуют практически в каждом php фреймворке. Но установить пакет/модуль/бандл и т.д. и включить его кликом мышки не получится. Придется сделать подключение провайдеров в коде, что-то настроить. В своих контроллерах подключать фасады или классы. Другими словами, разрабатывать свой код, при этом отдавая часть заботы о функционале установленным решениям.
Какой вывод из всего этого можно сделать.
Если ваш проект — это простой сайт, который не требует глубокой кастомизации, при этом нужно много разных плюшек, за которые заказчик не особо хочет платить, и нужно создать все уже на вчера, то CMS тут вне всякой конкуренции. Здесь даже без вопросов. Но если вы делаете проект, который будет постоянно дорабатываться, для которого нужно писать свои решения, нужен гибкий дизайн и всякие плюшки, да еще и нагрузка на сайт ожидается существенная, то тут однозначно выигрывает фреймворк. Так как вы сосредоточитесь именно на разработке того, что нужно именно вам, а не на борьбе с тем, что вам не нужно.