
2024-05-10
Установка EasyAdmin в Symfony 6
2023-07-26
EasyAdmin Bundle - удобная админка для Symfony 6. По-умолчанию предоставляет довольно простой CRUD с простой нативной визуалкой, что довольно удобно в условиях сжатых сроков.
Запустите нижеуказанную команду для установки:
composer require easycorp/easyadmin-bundle
Теперь вы готовы создать вашу первую страницу админки.
Первым делом EasyAdmin предлагает вам создать главную страницу так называемый DashBoard.
Представим, что у вас простое приложение всего с тремя Entity: User, BlogPost и Category. Сотрудники вашей компании могут создавать и редактировать любые данные этих сущностей, а внешние пользователи только создавать посты блога. В EasyAdmin вы можете реализовать это следующим образом:
1) создать три CRUD-контроллера UserCrudController, BlogPostCrudController, CategoryCrudController.
2) создать DashboardController которым могут пользоваться только сотрудники компании
3) создать ExternalDashboardController которым смогут пользоваться внешние пользователи
Технически все вышеуказанные контроллеры сродни обычным контроллерам Symfony, поэтому вы можете использовать такие штуки как $this->render() или $this->isGranted().
Классы контроллеров дашбордов должны имплементировать EasyCorp\Bundle\EasyAdminBundle\Contracts\Controller
\DashboardControllerInterface, который гарантирует наличие определенных методов в контроллере. Вместо реализации интерфейса вы также можете расширить AbstractDashboardController и в этом случае полагаться на поведение по-умолчанию.
Теперь давайте сгенерируем контроллер командой:
php bin/console make:admin:dashboard
Теперь вы можете зайти на страницу /admin и увидеть приветственное окно.
Теперь нам необходимо организовать меню и другие страницы. А также настроить главную страницу админки.
Далее нам стоит переопределить шаблон дашборда в файле templates/admin/my-dashboard.thml.twig
{# templates/admin/my-custom-page.html.twig #}
{% extends '@EasyAdmin/page/content.html.twig' %}
{% block content_title %}The Title of the Page{% endblock %}
{% block page_actions %}
<a class="btn btn-primary" href="...">Some Action</a>
{% endblock %}
{% block main %}
<table class="datagrid">
<thead>
<tr>
<td>Some Column</td>
<td>Another Column</td>
</tr>
</thead>
<tbody>
</tbody>
</table>
{% endblock %}
И также выставим примерно дефолтные значения в контроллере src/Controller/Admin/DashboardController:
<?php
namespace App\Controller\Admin;
use App\Entity\BlogPost;
use App\Entity\Category;
use App\Entity\User;
use EasyCorp\Bundle\EasyAdminBundle\Config\Dashboard;
use EasyCorp\Bundle\EasyAdminBundle\Config\MenuItem;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractDashboardController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class DashboardController extends AbstractDashboardController
{
#[Route('/admin', name: 'admin')]
public function index(): Response
{
return $this->render('admin/my-dashboard.html.twig');
}
public function configureDashboard(): Dashboard
{
return Dashboard::new()
->setTitle('Otezvikentiy Tech');
}
public function configureMenuItems(): iterable
{
yield MenuItem::linkToDashboard('Dashboard', 'fa fa-home');
yield MenuItem::linkToCrud('Users', 'fas fa-user', User::class);
yield MenuItem::linkToCrud('Categories', 'fas fa-navicon', Category::class);
yield MenuItem::linkToCrud('Blog Posts', 'fas fa-newspaper', BlogPost::class);
}
}
Теперь наша админка должна принять примерно вот такой вот вид:
Теперь, чтобы удобно управлять нашими сущностями стоит сразу же установить CKEditor для EasyAdmin. Это позволит иметь более приятный интерфейс для редактирования текстовых полей.
Запускаем установку бандла:
composer require friendsofsymfony/ckeditor-bundle
Затем убедитесь, что загрузилась последняя версия CKEditor используя команду:
php bin/console ckeditor:install
И запускаем еще одну команду, которая установит asset'ы в папку public.
php bin/console assets:install public
Теперь рассмотрим как сделать CrudController.
Запускаем команду для создания Crud контроллера и следуем инструкциям:
php bin/console make:admin:crud
Эта команда создаст нам файл контроллера, который нужно будет донастроить. Каждый круд контроллер имеет основные настройки, которые мы сейчас и рассмотрим. Первым делом в контроллере надо будет указать на какую сущность он ориентирован - делается это с помощью метода getEntityFqcn примерно так:
<?php
namespace App\Controller\Admin;
use App\Entity\BlogPost;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
class ArticleCrudController extends AbstractCrudController
{
public static function getEntityFqcn(): string
{
return BlogPost::class;
}
//...
}
Далее нам нужно сконфигурировать наш круд контроллер добавив метод configureCrud:
public function configureCrud(Crud $crud): Crud
{
return $crud
->setEntityLabelInSingular('...')
->setDateTimeFormat('Y-m-d H:i:s')
->setTimezone('Europe/Moscow')
->renderContentMaximized()
->setEntityLabelInSingular('BlogPost')
->setEntityLabelInPlural('BlogPosts')
->setEntityPermission('ROLE_ADMIN')
->setSearchFields(['title', 'content', 'slug'])
->setDefaultSort(['id' => 'DESC'])
->setPaginatorPageSize(20)
->setPaginatorRangeSize(4)
->setPaginatorUseOutputWalkers(true)
->setPaginatorFetchJoinCollection(true)
->addFormTheme('@FOSCKEditor/Form/ckeditor_widget.html.twig')
;
}
Далее нам необходмио сконфигурировать поля сущности:
public function configureFields(string $pageName): iterable
{
return [
TextField::new('title'),
TextField::new('slug'),
ImageField::new('mainPicture')->setBasePath('images')->setUploadDir('public/images')->setRequired(false),
AssociationField::new('author')->setQueryBuilder(fn (QueryBuilder $queryBuilder) => $queryBuilder->getEntityManager()->getRepository(User::class)->findAll()),
AssociationField::new('category')->setQueryBuilder(fn (QueryBuilder $queryBuilder) => $queryBuilder->getEntityManager()->getRepository(Category::class)->findAll()),
AssociationField::new('tags')->setQueryBuilder(fn (QueryBuilder $queryBuilder) => $queryBuilder->getEntityManager()->getRepository(Tag::class)->findAll())->setFormTypeOption('by_reference', false),
TextareaField::new('content')->setFormType(CKEditorType::class),
];
}
Каждое поле может иметь собственные настройки - полный список полей и их настроек можно посмотреть в официальной документации по EasyAdmin Bundle.
Вы можете модифицировать под себя CKEditor кастомизировав сборку как внешне так и функционально, используя их оф. сайт. Для этого вам необходимо будет перейти по ссылке, выбрать самый полный пресет, выбрать необходимые плагины и по итогу скачать оптимизированную сборку. Вам выдаст zip-архив и вам его надо будет распаковать в папку public/bundles/fosckeditor/* предварительно удалив оттуда всё содержимое.
В процессе у вас могут возникать ошибки с текстами из рязряда, что система пытается привести какую-то сущность к строке - в этом случае вам необходимо будет добавить в указанную сущность магический метод toString например так:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity()]
class BlogPost
{
//...
#[ORM\Column(length: 255, nullable: false)]
private string $title;
/**
* @return string
*/
public function __toString(): string
{
return $this->title;
}
//...
}
Ура! Я наконец-то дописал статью как собирать собственные бандлы на Symfony 6!!!
Статья про EasyAdmin всё ещё в процессе )))
Не, ну мне же надо на чем-то тестировать твиттер локальный...
Я тут еще много полезного буду выкладывать, так что заходите обязательно почитать.
Сайтик пока что в разработке - это далеко не окончательная версия - по сути это то что удалось слепить за 8 часов.
Комментарии