Sonata Admin для Symfony
Предисловие:
Данная статья написана для тех, кто только начинает изучать symfony и не является носителем обширных знаний про термины, методы работы с кодом и прочее. Однако, понимает как работает композер, терминал и прочие базовые вещи, иначе пришлось бы написать целую книгу, наверное. В общем, для тех, кто имеет базовые знания, но еще не освоился с тем как и чего работает.
По этому я старался написать простым языком, упрощая в некоторых местах, чтоб не забивать головы людей не самыми важными, на мой взгляд, на начальном этапе вещами.
В моей практике, самым используемым бандлом вместе с Symfony является бандл Sonata Admin. Ссыль на мануалы актуальной версии тут.
Что такое Sonata Admin bundle?
Это такой пакет для Symfony, который позволяет очень просто создать админ-панель для практически любого проекта.
Сложными словами: пакет, который позволяет создать конфигурируемый интерфейс редактирования сущностей ORM-модели.
Пакет работает с любыми типами баз данных, совместимыми с symfony. В моей практике были работы с MySQL и PostgreSQL.
И как это работает?
Все просто. Открываем сайт с мануалом, устанавливаем, потом просто открываем /admin и вуаля, у нас пустая админка для сайта. На скрине не совсем пустая, тут еще прикручено пару вещей, но общий смысл будет понятен.
А если добавить еще и какой-нибудь User Bundle, например FOSUserBundle, то при входе в админку будет еще и авторизация. А так же в админке можно будет добавлять и редактировать пользователей у вас на проекте.
Кстати, в Symfony можно легко поменять любой шаблон в бандле и вставить свой логотип, например. Или вообще другое оформление, но про это как-нибудь в другой раз.
А что дальше?
А дальше в админку можно добавить для редактирования любую таблицу, которую вы используете на проекте.
Нужно описать таблицу в App\Entity, создать конфигурацию для админки в App\Admin, потом просто подключить все к админке в config/services.yaml
Какой ты простой, скажет читатель, все рассказал, но ничего не понятно, давай пример.
Вот и пример.
Блог
Хочу я сделать, например, блог. Наверное, самый типичный пример из любого поста про подобные штуки, поскольку блог сочетает в себе большую часть базового функционала. У каждого блога, самая главная часть - посты. Вот на их примере я и покажу как это работает.
1) Нужно описать таблицу в App\Entity
Займемся этим. Что нам нужно для примитивной запись в блоге? Конечно же Заголовок, Контент, дата публикации и уникальный идентификатор записи, чтоб ее можно было открыть по ссылке.
Создаем Entity/News/Post.php
Прописываем нужные поля внутри. Я решил вставить скриншотами, так как здесь я не нашел возможности адекватно представить код так, чтоб все не съехалось и не превратилось в кашу.
@moderator, а не планируется функционал вставки кода в редакторе?
Про то как осуществлять мапинг в Доктрине, я думаю, нужно рассказать отдельным постом. Пока что, если вы не знаете что там происходит, просто примите код таким, какой он есть.
Нужно не забыть добавить функцию
Эта функция обеспечит автоматическое добавление даты создания в пост, именно в момент его создания.
Так же, описываем геттеры и сеттеры, людям, что знакомы с ООП, это все знакомо, приводить код в пример не буду. Если очень лень, многие IDE умеют генерировать все сами. Например, phpStorm предлагает целое меню того, что можно сгенерировать
А так же, можно создавать entity не вручную, а через команду в консоли php bin/console make:entity, которая задаст несколько вопросов про типы полей и сама все сделает - это довольно удобно, но я привык вручную, так уж вышло.
Не забудьте сделать миграцию и применить ее.
php bin/console doctrine:migrations:diff
php bin/console doctrine:migrations:migrate
2. Cоздать конфигурацию для админки в App\Admin
Создаем Admin/News/PostAdmin.php
В этом файле необходимо прописать поля для админки. Для этого есть несколько функций.
configureListFields() - размечает поля, которые должны быть отображены на главной странице, при выборе элементов для редактирования, а так же, какие туда добавить кнопки. Например, кнопка показать, редактировать, удалить и так далее.
configureDatagridFilters() - рассказывает админке по каким полям можно вести поиск.
configureFormFields() - Здесь описываются поля для страницы редактирования объекта
configureShowFields() - Здесь поля для отдельной страницы, которая позволяет просто посмотреть данные об объекте.
3. Подключить все к админке в config/services.yaml
Открываем config/services.yaml и добавляем:
Вуаля, у нас все работает:
Можно добавлять новость
Ты чего, хочешь чтоб я писал текст новости в простом текстовом поле? А как же заголовки, параграфы, все такое, писать прям html разметкой чтоль? - Спросил бы читатель.
А это легко исправить, отвечу я. Есть множество редакторов, доступных в интернетах, я привык использовать ckeditor, под него есть даже специальный бандл. Устанавливаем его так, как написано в мануале, подключаем в Admin/News/PostAdmin.php и вуаля. У нас есть визуальный редактор новости.
Итого, у нас есть блог, куда можно добавлять простые записи и админка для него. Я думаю, этого достаточно для описания базового функционала Sonata Admin.
Я думаю будет полезно создать серию постов про создание блога, который более подробно опишет методы работы и то как это вообще происходит постепенно. Предлагайте в комментариях, что мы будем дальше делать в нашем блоге из функционала, а я подумаю про то, в каком порядке будет полезнее и понятнее реализовывать данный проект :)
Всем спасибо, я закончил! 😌 Вот вам кот из интернетов