Структура приложения – это одна из основных причин, по которой PHP программисты превращаются из “изобретателей колеса” в пользователей фреймворков. Строгие соглашения о структуре приложения и именовании позволяют нам избавиться от тонны кода, сделать рабочий процесс предсказуемым и объединить усилия команды для быстрого и качественного написания ценного бизнес функционала – без вечного рефакторинга роутеров, контроллеров и тд
Yii Framework имеет консольную команду для создания основного костяка приложения, который позволяет практически сразу начать работу над веб-приложением. Gii Модуль позволяет создавать каркассы классов моделей, контроллеров и универсальных CRUD интрерфейсов. Однако, если функциональность вашего приложения находится за пределами обычного вебсайта, — фреймворк сам по себе уже не имеет встроенных помощников для создания комплексной архитектуры.
И, хотя, все добротные схемы организационной структуры приложения описаны и хорошо известны (на самом деле, не так уж и “хорошо”), это не освобождает нас от шаблонного конструирования в новых проектах время от времени. Здесь приходит на помощь готовый скелет структуры приложения.
Давайте рассмотрим большую веб систему с: фронтэндом (вебсайт для обычного использования), бэкэндом (панель администратора для управления веб-приложением) и веб-сервисом API (чтобы разрешить мобильным приложениям, к примеру, взаимодействовать с вашим веб-приложением). Такая структура должна позволить иметь общее ядро с бизнес моделью, масштабировать приложение в будущем и физически разделять части приложения между различными серверами.
Для быстрого развертывания такой структуры приложения мы можем использовать открытые решения от компаний Clevertec, MobiDev или Herzogkommunikation. В основном, эти решения являются скелетами приложений, которые могут быть использованы во всех видах проектов, от небольших вебсайтов до больших систем, как описано выше (к счастью, Yii framework в любом случае не будет требовать много вспомогательного кода даже для небольшого проекта, который использует масштабируемую структуру).
Итак, давайте изучим преимущества и слабые стороны этих решений.
Phundament
Ресурс размещения: http://phundament.com/
Разработчик: Herzogkommunikation
Ключевая особенность:
— основан на Composer
Плюсы:
— Намного больше, чем просто скелет приложения
— Используя Сomposer, вы можете установить CMS-подобное решение (управление пользователями, RBAC)
— Twitter bootstrap GUI
— Расширенная поддержка миграций баз данных
Минусы:
— Намного больше, чем просто скелет приложения
Да, это одно из преимуществ, однако для некоторых проектов это может быть наибольшим недостатком – в большинстве случаев вам просто не понадобится все это.
YiiBoilerplate
Ресурс размещения: https://github.com/clevertech/YiiBoilerplate
Разработчик: Clevertec
На мой взгляд, это одно из наилучших решений на сегодняшний день.
У него есть ряд связанных проектов, таких как YiiBackboneBoilerplate, чтобы обеспечить структуру веб сервиса для Backbone JS приложений и Yii-Booster, который интегрирует некоторый функционал YiiBootstrap с собственными модулями, как Grids и т. д. — благодаря сочетанию этих трех расширений вы получаете мощную основу практически для всех типов приложений.
Ключевая особенность:
— Совместимые функциональные дополнения
— Поддержка конфигурационный окружений
Плюсы:
— Очень хорошо структурирован и четко разделен
— Включена структура тестов Behat + Mink (BDD подход к тестированию)
— Общедоступные ресурсы ( JS, CSS) собраны в отдельном каталоге ( на мой взгляд, этот подход должен стать рекомендуемым в фреймворке)
— Минимум необходимых расширений в комплекте
Минусы:
— Постдеплойные действия обрабатываются кастомным php скриптом ( а это не так хорошо и недостаточно абстрактно, чтобы расширить/изменить)
Backvendor
Ресурс размещения: www.yiiframework.com//extension/backvendor
Разработчик: MobiDev
Ключевые особенности:
— Версионированный движок веб сервиса с автогенерацией документации
Плюсы:
— Использует Phing сценарий для деплоя
— Расширение страниц бэкэнда, которое автоматически управляет связями AR моделей и отображает связанные объекты (позволяют создавать базовый админ интерфейс с возможностью управлять этими взаимосвязями за очень короткое время)
— Расширяемая структура API для JSON веб сервиса
Минусы:
— Все компоненты тесно связаны
— Генератор скелета приложения выполнен в виде приложения Yii сам по себе, так что, если вы захотите изменить структуру генерируемого каркасса, это будет немного сложнее.
Выводы
На мой взгляд, пока еще не существует идеального решения и я уверен, что никогда не будет такого, которое подойдет всем:) YiiAppBoilerplate моей мечты еще не создан, но он должен быть структурирован так же, как и YiiBoilerplate, я должен иметь возможность расширить его с помощью менеджера пакетов как Phundament и я хотел бы некоторые расширения типа JSON веб сервис и отдельные расширения для страниц бэкэнда от Backvendor.
Будем надеяться, что как известно по слухам Yii2 будет иметь поддержку управления пакетами Composer, укомплектованные Twitter Bootstrap и различные генераторы скелетов приложений (для базовых и масштабных приложений) прямо из коробки — тогда, надеюсь, не будут нужны сторонние структурные фреймворки для Yii и будет достаточно собственных conposer.json в наших новых проектах.