自定义管理后台
扩展
管理扩展允许您添加或更改一个或多个 Admin 实例的功能。要创建扩展,您的类必须实现 SonataAdminBundleAdminAdminExtensionInterface 接口并注册为服务。该接口定义了许多函数,您可以使用这些函数来自定义编辑表单、列表视图、表单验证、更改新创建的对象和其他管理功能。
提示
由于 sonata 中的大多数类都是 final 的,“扩展”是自定义在 sonata 代码中创建的 admin 的一种简便方法。
例如,假设我们要自定义 PageAdmin
,在 admin 页面中添加 position
字段,并且此 admin 被声明为 sonata.page.admin.page
1 2 3 4 5 6 7 8 9 10 11 12 13 14
namespace App\Admin\Extension;
use Sonata\AdminBundle\Admin\AbstractAdminExtension;
use Sonata\AdminBundle\Form\FormMapper;
use Symfony\Component\DependencyInjection\Attribute\AutoconfigureTag;
#[AutoconfigureTag(name: 'sonata.admin.extension', attributes: ['target' => 'sonata.page.admin.page'])]
final class PositionAdminExtension extends AbstractAdminExtension
{
public function configureFormFields(FormMapper $form): void
{
$form->add('position');
}
}

如您所见,position 字段已添加到管理页面中!
提示
如果您想将字段添加到现有组,您可以查看 表单视图
提示
如果您想重新排序字段,请查看 重新排序字段
注意
要了解有关如何使用 yaml、xml 或 php 文件配置服务标签的更多信息,请查看 Symfony 标签文档
sonata.admin.extension
标签支持的属性
属性名称 | 描述 |
---|---|
target | 您想要自定义的 Admin 服务名称。如果您使用 global 属性为 true,则无需传递它。 |
global | 将扩展添加到所有 admin。 |
excludes | 指定一个或多个不应添加扩展的 admin 服务 ID(这将阻止它匹配任何其他设置)。 |
extends | 指定一个或多个类。如果 admin 的托管类扩展了指定的类之一,则扩展将被添加到该 admin。 |
implements | 指定一个或多个接口。如果 admin 的托管类实现了指定的接口之一,则扩展将被添加到该 admin。 |
instanceof | 指定一个或多个类。如果 admin 的托管类扩展了指定的类之一或属于该类的实例,则扩展将被添加到该 admin。 |
uses | 指定一个或多个 traits。如果 admin 的托管类使用了指定的 traits 之一,则扩展将被添加到该 admin。 |
admin_extends | 指定一个或多个类。如果 admin 的类扩展了指定的类之一,则扩展将被添加到该 admin。 |
admin_implements | 指定一个或多个接口。如果 admin 的类实现了指定的接口之一,则扩展将被添加到该 admin。 |
admin_instanceof | 指定一个或多个类。如果 admin 的类扩展了指定的类之一或属于该类的实例,则扩展将被添加到该 admin。 |
admin_uses | 指定一个或多个 traits。如果 admin 的类使用了指定的 traits 之一,则扩展将被添加到该 admin。 |
priority | 可以是正整数或负整数。优先级越高,执行得越早。 |
sonata 配置中的配置扩展
这是配置 Admin 扩展的另一种方式,如果您不想使用服务标签,它在您的 sonata_admin 配置中定义
1 2 3 4 5 6 7
# config/packages/sonata_admin.yaml
sonata_admin:
extensions:
app.publish.extension:
admins:
- App\Admin\Extension\PositionAdminExtension
属性名称 | 描述 |
---|---|
global | 将扩展添加到所有 admin。 |
admins | 指定一个或多个应添加扩展的 admin 服务 ID。 |
excludes | 指定一个或多个不应添加扩展的 admin 服务 ID(这将阻止它匹配任何其他设置)。 |
extends | 指定一个或多个类。如果 admin 的托管类扩展了指定的类之一,则扩展将被添加到该 admin。 |
implements | 指定一个或多个接口。如果 admin 的托管类实现了指定的接口之一,则扩展将被添加到该 admin。 |
instanceof | 指定一个或多个类。如果 admin 的托管类扩展了指定的类之一或属于该类的实例,则扩展将被添加到该 admin。 |
uses | 指定一个或多个 traits。如果 admin 的托管类使用了指定的 traits 之一,则扩展将被添加到该 admin。 |
admin_extends | 指定一个或多个类。如果 admin 的类扩展了指定的类之一,则扩展将被添加到该 admin。 |
admin_implements | 指定一个或多个接口。如果 admin 的类实现了指定的接口之一,则扩展将被添加到该 admin。 |
admin_instanceof | 指定一个或多个类。如果 admin 的类扩展了指定的类之一或属于该类的实例,则扩展将被添加到该 admin。 |
admin_uses | 指定一个或多个 traits。如果 admin 的类使用了指定的 traits 之一,则扩展将被添加到该 admin。 |
priority | 可以是正整数或负整数。优先级越高,执行得越早。 |
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
# config/packages/sonata_admin.yaml
sonata_admin:
extensions:
app.publish.extension:
global: true
admins:
- app.admin.article
implements:
- App\Publish\PublishStatusInterface
excludes:
- app.admin.blog
- app.admin.news
extends:
- App\Document\Blog
instanceof:
- App\Document\Page
uses:
- App\Trait\Timestampable
admin_implements:
- App\Admin\PublishableAdminInterface
admin_extends:
- App\Admin\AbstractAdmin
admin_instanceof:
- App\Admin\MediaAdmin
admin_uses:
- App\Trait\Loggable
如果这些选项不能满足您的需求,您仍然可以在 admin 的 `AdminInterface::configure()` 方法中使用 `addExtension` 和 `removeExtension` 方法动态添加/删除扩展
1 2 3 4 5 6 7 8 9 10 11 12 13 14
use App\AdminExtension\PublishStatusAdminExtension;
use Sonata\AdminBundle\Admin\AbstractAdmin;
final class PublishStatusAdmin extends AbstractAdmin
{
protected function configure(): void
{
// ...
if ($someCondition) {
$this->addExtension(new PublishStatusAdminExtension());
}
}
}
重新排序字段
有时您想重新排序从扩展添加的字段。传递 SonataAdminBundleAdminAdminInterfaceMapperInterface 或 SonataBlockBundleFormMapperFormMapper 作为参数的方法,您可以使用 reorder
方法
如果您想重新排序字段 表单视图,您可以这样做
1 2 3 4 5 6 7 8 9 10 11 12
public function configureFormFields(FormMapper $form): void
{
$form
->with('main')
->reorder([
'url',
'position'
])
->add('position')
->end()
;
}
在这种情况下,position 字段将位于 main 组中,在 url 字段之后
