SymfonyWorld Online 2020
100% online
30+ talks + workshops
Live + Replay watch talks later

Шаг 9: Создание административной панели

5.0 version
Maintained

Создание административной панели

Именно администраторы проекта будут добавлять предстоящие конференции в базу данных. Административная панель — это защищённый раздел сайта, где администраторы проекта могут изменять данные, модерировать отзывы и многое другое.

Можно быстро сгенерировать панель администрирования на базе модели проекта, используя один из бандлов. EasyAdmin как раз то, что нам нужно.

Настройка бандла EasyAdmin

Для начала добавьте бандл EasyAdmin в зависимости проекта:

1
$ symfony composer req "admin:^2.0"

Для настройки EasyAdmin по его Flex-рецепту был создан новый конфигурационный файл:

config/packages/easy_admin.yaml
1
2
3
4
5
6
#easy_admin:
#    entities:
#        # List the entity class name you want to manage
#        - App\Entity\Product
#        - App\Entity\Category
#        - App\Entity\User

Почти все установленные пакеты имеют подобный файл с конфигурацией в директории config/packages/. Чаще всего настройки по умолчанию отлично подходят для большинства приложений.

Раскомментируйте первую пару строк и добавьте классы моделей проекта:

config/packages/easy_admin.yaml
1
2
3
4
easy_admin:
    entities:
        - App\Entity\Conference
        - App\Entity\Comment

Перейдите в браузере по пути /admin к уже готовой административной панели. И вуаля! У нас уже есть красивый и многофункциональный интерфейс для управления конференциями и комментариями:

Совет

Почему административная панель доступна по адресу /admin? Всё потому, что использовался префикс по умолчанию, заданный в файле config/routes/easy_admin.yaml:

config/routes/easy_admin.yaml
1
2
3
4
easy_admin_bundle:
    resource: '@EasyAdminBundle/Controller/EasyAdminController.php'
    prefix: /admin
    type: annotation

Вы можете изменить его на что угодно.

В данный момент невозможно добавить новые конференции и комментарии, поскольку произойдёт ошибка конвертации объекта в строку — Object of class App\Entity\Conference could not be converted to string. Бандл EasyAdmin попытается отобразить конференцию с комментариями к ней, но в итоге не сможет этого сделать, потому что нет строкового представления обоих сущностей. Добавление метода __toString() в класс Conference поможет устранить ошибку:

patch_file
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
--- a/src/Entity/Conference.php
+++ b/src/Entity/Conference.php
@@ -43,6 +43,11 @@ class Conference
         $this->comments = new ArrayCollection();
     }

+    public function __toString(): string
+    {
+        return $this->city.' '.$this->year;
+    }
+
     public function getId(): ?int
     {
         return $this->id;

То же самое сделайте в классе Comment:

patch_file
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
--- a/src/Entity/Comment.php
+++ b/src/Entity/Comment.php
@@ -48,6 +48,11 @@ class Comment
      */
     private $photoFilename;

+    public function __toString(): string
+    {
+        return (string) $this->getEmail();
+    }
+
     public function getId(): ?int
     {
         return $this->id;

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

Добавьте несколько комментариев без фотографий. Пока установите дату вручную, затем в следующих шагах мы сделаем автозаполнение столбца createdAt.

Настройка EasyAdmin

Административная панель по умолчанию работает хорошо, хотя она может по-разному настраиваться, чтобы улучшить удобство её использования. Внесем несколько простых изменений для демонстрации доступных вариантов. Заменим стандартную конфигурацию на следующую:

config/packages/easy_admin.yaml
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
easy_admin:
    site_name: Conference Guestbook

    design:
        menu:
            - { route: 'homepage', label: 'Back to the website', icon: 'home' }
            - { entity: 'Conference', label: 'Conferences', icon: 'map-marker' }
            - { entity: 'Comment', label: 'Comments', icon: 'comments' }

    entities:
        Conference:
            class: App\Entity\Conference

        Comment:
            class: App\Entity\Comment
            list:
                fields:
                    - author
                    - { property: 'email', type: 'email' }
                    - { property: 'createdAt', type: 'datetime' }
                sort: ['createdAt', 'ASC']
                filters: ['conference']
            edit:
                fields:
                    - { property: 'conference' }
                    - { property: 'createdAt', type: datetime, type_options: { attr: { readonly: true } } }
                    - 'author'
                    - { property: 'email', type: 'email' }
                    - text

Мы переопределили секцию design, чтобы добавить иконки в меню, а также ссылку на главную страницу сайта.

В секции Comment перечисление полей позволяет расположить их в нужном нам порядке. Некоторые поля были дополнены дополнительными настройками. К примеру, поле с датой создания доступно только для чтения. Секция filters определяет, какие фильтры будут находится рядом с обычным полем поиска.

Это всего лишь небольшая часть возможных настроек в EasyAdmin.

Ознакомьтесь с административной панелью, отфильтруйте комментарии по какой-нибудь конференции или, например, найдите их по адресу электронной почты. Однако есть последняя неразрешённая проблема — любой пользователь может войти в панель администрирования. Мы это обязательно исправим в следующих шагах.

1
$ symfony run psql -c "TRUNCATE conference RESTART IDENTITY CASCADE"

  • « Previous Шаг 8: Описание структуры данных
  • Next » Шаг 10: Создание пользовательского интерфейса

This work, including the code samples, is licensed under a Creative Commons BY-NC-SA 4.0 license.