跳到内容

自定义管理后台

编辑此页

扩展

管理扩展允许您添加或更改一个或多个 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 字段已添加到管理页面中!

提示

如果您想将字段添加到现有组,您可以查看 表单视图

提示

如果您想重新排序字段,请查看 重新排序字段

注意

要了解有关如何使用 yamlxmlphp 文件配置服务标签的更多信息,请查看 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());
        }
    }
}

重新排序字段

有时您想重新排序从扩展添加的字段。传递 SonataAdminBundleAdminAdminInterfaceMapperInterfaceSonataBlockBundleFormMapperFormMapper 作为参数的方法,您可以使用 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 字段之后

这项工作,包括代码示例,根据 Creative Commons BY-SA 3.0 许可获得许可。
目录
    版本