Панель управления 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. Сразу после установки войдите на сайт гостем и убедитесь, что панель недоступна, а лучше — напишите тест, который это проверяет.