Как создать гибкую панель администратора с помощью пакетов Symfony 2?

#plugins #symfony #admin

#Плагины #symfony #администратор

Вопрос:

Я хочу создать пакет администратора, который каким-то образом обнаруживает другие пакеты и пытается добавить их в меню и в тот же контекст RBAC.

Например:

  • AdminBundle определяет маршрут / admin / dashboard, который требует аутентификации и авторизации. В меню вы можете увидеть 3 пункта, например: панель мониторинга, конфигурация (некоторые конфигурации хранятся в БД) и пользователи (CRUD для пользователей, найденный в UserBundle)
  • Затем кто-то добавляет ProductBundle, который имеет дело с CRUD для продуктов электронной коммерции или что-то в этомроде. Каким-то образом, без изменения какого-либо кода в AdminBundle, у нас теперь есть новый пункт «продукты», доступный в меню в /admin / dashboard
  • Позже CRUD продуктов больше не нужен, поэтому мы просто удаляем ProductBundle, и он автоматически исчезает из меню панели администратора.

Как бы вы приступили к реализации чего-то подобного? Есть ли какая-либо встроенная поддержка плагиноподобного дизайна, подобного этому, в symfony 2?

Ответ №1:

Я не знаю о полноценном решении для плагинов, но мой подход был бы:

Есть один «главный серверный сервер», назовите его MasterAdminBundle для удобства разговора. Этот пакет содержит base.html.twig, который просто помогает определить панель навигации в области администрирования и {% block content %} . В нем также есть какой-то MenuService , который отображает меню. Я бы попросил другие мои пакеты зарегистрировать в этом сервисе AdminMenu подкласс посредством использования системы тегов точно так же, как Voter можно зарегистрироваться в Security Context (см. Здесь).

В base.html.twig я бы, скорее всего, использовал встроенный контроллер для отображения меню.

Теперь, когда такая структура установлена, ваши другие пакеты могут оставаться инкапсулированными, сохраняя свои собственные маршруты администрирования и интерфейсы:

ProductController теперь также было бы, ProductAdminController где вы можете использовать префикс маршрута @Route("/admin") в определении класса. Затем любые маршруты могут отображать шаблоны из пакета, поскольку шаблоны хранятся под именем контроллера. AcmeProductBundleResourcesviewsProductAdminedit_products.html.twig при условии, что они расширяют base.html.twig from MasterAdminBundle и помещают свой контент в content блок.

Для других вещей, таких как панель мониторинга, к которой вы хотели подключить другие пакеты, я, скорее всего, просто продолжу действовать тем же путем, создам сервис в MasterAdminBundle и использую теги для загрузки в него других классов с требуемыми данными.

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

Комментарии:

1. Интересно. Я не использовал систему тегов, я буду читать об этом. Спасибо