Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Панель управления EasyAdmin

Почти каждому сайту нужна панель управления: список статей, пользователей, заказов с поиском и формами редактирования. Писать её вручную долго и скучно. Пакет EasyAdmin строит такую панель по сущностям Doctrine.

Установка

composer require easycorp/easyadmin-bundle
php bin/console make:admin:dashboard

Вторая команда создаёт главный контроллер панели — по умолчанию она открывается по адресу /admin.

Раздел для сущности

php bin/console make:admin:crud

Команда спросит, для какой сущности создать раздел, и создаст контроллер:

namespace App\Controller\Admin;
 
use App\Entity\Post;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
 
class PostCrudController extends AbstractCrudController
{
    public static function getEntityFqcn(): string
    {
        return Post::class;
    }
}

Этого уже достаточно: появятся список, поиск, формы создания и изменения, удаление.

Меню

Разделы добавляют в меню в контроллере панели:

use EasyCorp\Bundle\EasyAdminBundle\Config\MenuItem;
 
public function configureMenuItems(): iterable
{
    yield MenuItem::linkToDashboard('Главная', 'fa fa-home');
    yield MenuItem::section('Содержимое');
    yield MenuItem::linkToCrud('Статьи', 'fa fa-file-text', Post::class);
    yield MenuItem::linkToCrud('Комментарии', 'fa fa-comment', Comment::class);
    yield MenuItem::section('Люди');
    yield MenuItem::linkToCrud('Пользователи', 'fa fa-user', User::class);
}

Поля

По умолчанию EasyAdmin показывает все свойства. Метод configureFields() задаёт, какие поля выводить и как:

use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
use EasyCorp\Bundle\EasyAdminBundle\Field\BooleanField;
use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField;
use EasyCorp\Bundle\EasyAdminBundle\Field\IdField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextEditorField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
 
public function configureFields(string $pageName): iterable
{
    yield IdField::new('id')->hideOnForm();
    yield TextField::new('title', 'Заголовок');
    yield TextEditorField::new('body', 'Текст')->hideOnIndex();
    yield AssociationField::new('author', 'Автор');
    yield BooleanField::new('published', 'Опубликована');
    yield DateTimeField::new('createdAt', 'Создана')->hideOnForm();
}

hideOnForm() убирает поле из формы, hideOnIndex() — из списка.

Поиск, сортировка, фильтры

use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Config\Filters;
 
public function configureCrud(Crud $crud): Crud
{
    return $crud
        ->setEntityLabelInSingular('статью')
        ->setEntityLabelInPlural('Статьи')
        ->setSearchFields(['title', 'body'])
        ->setDefaultSort(['createdAt' => 'DESC'])
        ->setPaginatorPageSize(30);
}
 
public function configureFilters(Filters $filters): Filters
{
    return $filters->add('published')->add('author')->add('createdAt');
}

Свои действия

Кроме стандартных кнопок можно добавить свою — например, «Опубликовать». Действие описывают в configureActions() и связывают с методом контроллера.

Защита

Панель должна быть закрыта от посторонних:

# config/packages/security.yaml
security:
    access_control:
        - { path: ^/admin, roles: ROLE_ADMIN }

Отдельные разделы можно ограничить точнее: MenuItem::linkToCrud(...)->setPermission('ROLE_SUPER_ADMIN').

Частая ошибка

Правило в access_control легко забыть или случайно удалить — и панель откроется любому, кто угадает адрес /admin. Сразу после установки войдите на сайт гостем и убедитесь, что панель недоступна, а лучше — напишите тест, который это проверяет.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.