创建管理后台
在前一章节中,您已经能够让管理界面工作起来。在本教程中,您将学习如何告诉 SonataAdmin 管理员如何管理您的模型。
步骤 0:创建模型
在教程的其余部分,您将需要某种模型。在本教程中,将使用 BlogPost
和 Category
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
// src/Entity/BlogPost.php
namespace App\Entity;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
class BlogPost
{
// ...
#[ORM\Column(type: Types::STRING)]
private ?string $title = null;
#[ORM\Column(type: Types::TEXT)]
private ?string $body = null;
#[ORM\Column(type: Types::BOOLEAN)]
private bool $draft = false;
#[ORM\ManyToOne(targetEntity: Category::class, inversedBy: 'blogPosts')]
private ?Category $category = null;
}
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
// src/Entity/Category.php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
class Category
{
// ...
#[ORM\Column(type: Types::STRING)]
private ?string $name = null;
#[ORM\OneToMany(targetEntity: BlogPost::class, mappedBy: 'category')]
private Collection $blogPosts;
public function __construct()
{
$this->blogPosts = new ArrayCollection();
}
public function getBlogPosts(): Collection
{
return $this->blogPosts;
}
}
之后,为这些实体创建 schema
1
bin/console doctrine:schema:create
注意
本文假设您对 Doctrine2 ORM 有基本了解,并且已经正确设置了数据库。您可以在数据库和 Doctrine ORM 章节中了解有关 Doctrine 实体的更多信息。
步骤 1:创建 Admin 类
SonataAdminBundle 帮助您使用图形界面管理数据,该界面使您可以创建、更新或搜索模型实例。该 Bundle 依赖于 Admin 类来了解将要管理的模型以及这些操作的外观。
Admin 类决定在列表上显示哪些字段,哪些字段用于查找条目以及创建表单的外观。每个模型都将有自己的 Admin 类。
了解了这一点,让我们为 Category
实体创建一个 Admin 类。最简单的方法是扩展 Sonata\AdminBundle\Admin\AbstractAdmin
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 30 31 32 33
// src/Admin/CategoryAdmin.php
namespace App\Admin;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Show\ShowMapper;
use Symfony\Component\Form\Extension\Core\Type\TextType;
final class CategoryAdmin extends AbstractAdmin
{
protected function configureFormFields(FormMapper $form): void
{
$form->add('name', TextType::class);
}
protected function configureDatagridFilters(DatagridMapper $datagrid): void
{
$datagrid->add('name');
}
protected function configureListFields(ListMapper $list): void
{
$list->addIdentifier('name');
}
protected function configureShowFields(ShowMapper $show): void
{
$show->add('name');
}
}
那么,这段代码是做什么的呢?
- configureFormFields(): 此方法配置在编辑和创建操作中显示的字段。
FormMapper
的行为类似于 Symfony Form 组件的FormBuilder
; - configureDatagridFilters(): 此方法配置过滤器,用于过滤和排序模型列表;
- configureListFields(): 此方法配置在列出所有模型时显示的字段(
addIdentifier()
方法意味着此字段将链接到此特定模型的显示/编辑页面); - configureShowFields(): 此方法配置在显示操作中显示的字段。
这是 Admin 类最基本的示例。您可以使用 Admin 类配置更多内容。其他更高级的文章将涵盖这一点。
步骤 2:注册 Admin 类
您现在已经创建了一个 Admin 类,但是目前 SonataAdminBundle 无法知道此 Admin 类的存在。要告知 SonataAdminBundle 此 Admin 类的存在,您必须创建一个服务并使用 sonata.admin
标签对其进行标记
1 2 3 4 5 6 7 8
# config/services.yaml
services:
# ...
admin.category:
class: App\Admin\CategoryAdmin
tags:
- { name: sonata.admin, model_class: App\Entity\Category, manager_type: orm, label: Category }
标签选项 | 描述 |
---|---|
name | 服务标签的名称 |
model_class | 实体类,例如:App\Entity\Category |
manager_type | 管理器类型 (orm , odm ) |
label | 标签,例如 Category |
group (optional ) |
管理员组,它将用于在左侧菜单中分组,例如 Category |
controller (optional ) |
如果您想使用自定义控制器,请传递类名。 |
基本 Admin 类的构造函数有很多参数。SonataAdminBundle 提供了一个编译器传递,负责为您正确配置它。您通常可以使用标签属性来调整内容。此处显示的代码是使其正常工作所需的最短代码。
步骤 3:注册 SonataAdmin 自定义路由
SonataAdminBundle 会动态生成 Admin 类的路由。要加载这些路由,您必须确保执行 SonataAdminBundle 的路由加载器
1 2 3 4 5 6 7
# config/routes/sonata_admin.yaml
# ...
_sonata_admin:
resource: .
type: sonata_admin
prefix: /admin
查看 Category Admin 界面
现在您已经为您的 category 创建了 admin 类,您可能想知道这在 admin 界面中是什么样子。好吧,让我们通过访问 http://localhost:8000/admin 来找出答案

随意尝试并添加一些类别,例如“Symfony”和“Sonata Project”。在接下来的章节中,您将为 BlogPost
实体创建一个 admin,并了解有关此类别的更多信息。
注意
如果您没有看到漂亮的标签,而是看到了类似“link_add”的内容,则应确保您已启用了翻译器。
在下一章中,您将了解表单视图。