Какая будет лучшая практика разделения кода для больших проектов в Symfony4?

Выход 4-й версии популярного фреймворка ознаменовался капитальными изменениями в структуре проектов. Включая официальную документацию, в отношении объединения кода отмечается следующее (http://symfony.com/doc/current/bundles.html):

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

Во 2-й и 3-й версиях связка выполняла две основные задачи. 1) Если разработчик или группа разработчиков в своих разных проектах использовали один большой повторяющийся функционал, то его можно было выделить в отдельный пакет и перенести из проекта в проект. Хороший пример такого использования - система пользователей в любом проекте. Он включает модели User, Role, Permission (и, возможно, другие), контроллеры для объекта, а также контроллеры для входа в приложение, выхода из приложения (политика безопасности может быть другой одновременно) и шаблоны для просмотра. Еще один хороший пример - административная панель, фундамент у которой идентичен. 2) Symfony взял отдельные функции в разных каталогах с логической точки зрения и, соответственно, пространства имен путем объединения. Например, в одном из своих прошлых проектов я разделил пространства: система управления пользователями, геймификация приложений (цель социальной сети), пространство партнеров, гео-среда (для работы с картами и определения городов по IP), среда для платежных транзакций. . Следующее. Структура проекта Symfony [2-3]

В моем следующем проекте я не хочу использовать ничего, кроме Symfony4, чтобы следовать лучшим практикам фреймворка во время реализации его новых функций. Как организовать разделение логически независимого кода на разные области, если официальная документация уже не настаивает на создании бандлов ??? Если все классы модели хранятся в одном каталоге, это создает путаницу и увеличивает время поиска нужного файла в структуре большого проекта. То же самое касается шаблонов и всего остального. Когда я работаю с одним функционалом, у меня только выпадающие каталоги этого функционала.

Неужели теперь Symfony поощряет вас определять структуру классов, шаблонов и тому подобного по своему усмотрению?


person Vitaly Vesyolko    schedule 08.12.2017    source источник


Ответы (4)


Поскольку я новичок в Symfony и начиная с версии 4.2, у меня была та же проблема, что и у @DeveloperMobile.

Структура каталогов

Это моя структура каталогов, основанная на рекомендациях Руководства Symfony Best Practices версии 4.2.

Рекомендация в основном говорит о строении:

  • Поместите все контроллеры в / src / Controller, разделив их подпапками
  • Не используйте пакеты, организуйте свой код по пространствам имен
  • Поместите активы, конфигурацию, тесты, шаблоны, переводы, var / cache и var / log в корневую папку
  • Организуйте свою бизнес-логику в / src
  • Используйте автоматическое подключение, чтобы автоматизировать настройку сервисов приложений.
  • Используйте внедрение зависимостей для получения сервисов
  • Тонкие контроллеры и толстая модель

Итак, в основном это говорит: да, вы можете организовать свой код в / src с помощью подпапок, но код с определенной функциональностью, такой как контроллер, сущность, форма, репозиторий и т. Д., Должен находиться в конкретном каталоге.

Выполнение

root/
├─ assets/
├─ bin/
│  └─ console
├─ config/
└─ public/
│  └─ index.php
├─ src/
   ├─ Controller/
     ├─ DefaultController.php
     ├─ ...
     ├─ Api/
     │   ├─ ..
     │   └─ ..
     ├─ Backend/
     │   ├─ ..
     │   └─ ..
   ├─ Entity/
   ├─ Form/
   ├─ Repository/
   ├─ Twig/
   ├─ Utils/
   └─ Kernel.php
├─ tests/
├─ templates/
├─ translations/
├─ var/
│  ├─ cache/
│  └─ log/
└─ vendor/

Лучшая практика Symfony 4.2

Это список всех рекомендаций по ссылке выше:

Установка

  • Используйте Composer и Symfony Flex для создания приложений Symfony и управления ими.
  • Используйте Symfony Skeleton для создания новых проектов на основе Symfony.

Структура

  • Не создавайте никаких пакетов для организации логики вашего приложения.

    (Приложения Symfony по-прежнему могут использовать сторонние пакеты (установленные в vendor /) для добавления функций, но вы должны использовать пространства имен PHP вместо пакетов для организации собственного кода.)

Конфигурация

  • Определите параметры конфигурации, связанные с инфраструктурой, как переменные среды. Во время разработки используйте файлы .env и .env.local в корне вашего проекта, чтобы установить их.

  • Определите все переменные env вашего приложения в файле .env

  • Определите параметры конфигурации, связанные с поведением приложения, в файле config / services.yaml.
  • Используйте константы для определения параметров конфигурации, которые редко меняются.
  • Имя ваших параметров конфигурации должно быть как можно короче и должно включать общий префикс для всего приложения.

Бизнес-логика

Для большинства проектов весь код следует хранить в каталоге src /. Здесь вы можете создавать любые каталоги, которые хотите организовать:

  • Используйте автоматическое подключение, чтобы автоматизировать настройку сервисов приложений.
  • Идентификатор служб вашего приложения должен быть равен имени их класса, за исключением случаев, когда у вас есть несколько служб, настроенных для одного и того же класса (в этом случае используйте идентификатор случая змеи).
  • По возможности службы должны быть частными. Это предотвратит доступ к этой службе через $ container-> get (). Вместо этого вам нужно будет использовать внедрение зависимостей.
  • Используйте формат YAML для настройки ваших собственных сервисов.
  • Используйте аннотации для определения информации о отображении сущностей Doctrine.

Контроллеры

  • Сделайте так, чтобы ваш контроллер расширил базовый контроллер AbstractController, предоставляемый Symfony, и по возможности используйте аннотации для настройки маршрутизации, кэширования и безопасности.
  • Не добавляйте суффикс Action к методам действий контроллера.
  • Не используйте аннотацию @Template для настройки шаблона, используемого контроллером. -Не используйте $ this-> get () или $ this-> container-> get () для получения сервисов из контейнера. Вместо этого используйте внедрение зависимостей.
  • Используйте уловку ParamConverter для автоматического запроса сущностей Doctrine, когда это просто и удобно.

Шаблоны

  • Используйте для своих шаблонов формат Twig.
  • Сохраните шаблоны приложений в каталоге templates / в корне вашего проекта.
  • Используйте snake_case в нижнем регистре для имен каталогов и шаблонов.
  • Используйте префикс подчеркивания для частичных шаблонов в именах шаблонов.
  • Определите свои расширения Twig в каталоге src / Twig /. Ваше приложение автоматически обнаружит их и настроит.

Формы

  • Определите свои формы как классы PHP.
  • Поместите классы типов форм в пространство имен App \ Form, если вы не используете другие настраиваемые классы форм, такие как преобразователи данных.
  • Добавляйте кнопки в шаблоны, а не в классы форм или контроллеры.
  • Не определяйте ограничения проверки в форме, а на объекте, которому сопоставляется форма.

Интернационализация

  • Сохраните файлы переводов в каталоге translations / в корне вашего проекта.
  • Используйте формат XLIFF для файлов перевода.
  • Всегда используйте ключи для переводов вместо строк содержимого.

Безопасность

  • Если у вас нет двух законно разных систем аутентификации и пользователей (например, форма входа в систему для основного сайта и система токенов только для вашего API), мы рекомендуем иметь только одну запись брандмауэра с включенным анонимным ключом.
  • Используйте кодировщик bcrypt для хеширования паролей пользователей.
  • Определите настраиваемого избирателя безопасности для реализации детальных ограничений.

Веб-активы

  • Храните свои активы в каталоге assets / в корне вашего проекта.
  • Используйте Webpack Encore для компиляции, объединения и минимизации веб-ресурсов.

Тесты

  • Определите функциональный тест, который хотя бы проверяет, успешно ли загружаются страницы вашего приложения.
  • Жестко закодируйте URL-адреса, используемые в функциональных тестах, вместо использования генератора URL.
person Wolfgang Blessen    schedule 06.04.2019
comment
Я знаю, что это выходит за рамки, но я хотел бы увидеть вашу рекомендацию по переносу локального приложения для разработки на удаленный веб-хост. Пошаговый процесс. - person klewis; 11.05.2019
comment
@klewis Извините, я думаю, что мой способ еще не лучший ;-) - person Wolfgang Blessen; 15.05.2019
comment
Я думаю, что лучший способ - это stackoverflow.com/a/52036756/2046442, поскольку вы сказали, что это сложнее копируя из одного проекта в другой, вы должны перемещаться между каталогами и копировать по частям. - person jcarlosweb; 09.09.2020

Как говорится (источник), вы определяете свою собственную структуру, не рекомендуется проводить рефакторинг всего вашего фактического приложения.

Наша рекомендация ясна и ясна: вы можете использовать эти передовые методы для новых приложений, но вам не следует проводить рефакторинг существующих приложений в соответствии с этими передовыми практиками.

Надеюсь, ты получил ответ :)

person Nelson Rodrigues Marreiros    schedule 05.04.2019
comment
Вопрос в новом проекте. - person Wolfgang Blessen; 06.04.2019

Каждый большой проект должен быть разделен на backend, frontend и api или services, и между ними должен быть ключ переменной формата, ключ кода ошибки и управление ключом кеша, поэтому каждый проект должен иметь собственную зависимость, сокращать время обслуживания, час разработки, и т.д ...

backend.mysite.com

www.mysite (frontend)

api.mysite.com
person Adrian Romero    schedule 02.04.2019
comment
Это работает, только если вы используете интерфейсную платформу. Если вы используете страницы twig, весь исходный код должен быть в одном проекте (api может быть независимым и включать / получать доступ к основному бэкэнду). - person Etshy; 05.04.2019

Как сказал @Nelson, нет необходимости реорганизовывать ваше текущее приложение.

Если это для нового проекта, вы можете делать то, что хотите.

Например, вы можете сделать свои контроллеры такими

src
   - Controller
      - Bundle1 //Bundle is not the right word here, it's just to say you can separate your code in independents parts like this
      - Bundle2

То же самое для логических классов, моделей (сущность / документ) и т. Д. И т. Д.

Вам просто нужно изменить файл services.yaml, чтобы указать, где находятся ваши контроллеры, и определить, в каких папках у вас есть службы (классы для инъекций) и т. Д.

Вы в основном можете делать все, что захотите, даже если рекомендуется следить за их демонстрационным приложением (src/controller/*, src/Form/* и т. Д.)

Вопрос старый, и я надеюсь, что он вам все еще поможет.

person Etshy    schedule 05.04.2019