nucleos/sonata-auto-configure-bundle

自动配置 Sonata Admin 的 Symfony Bundle

1.2.0 2023-12-21 13:50 UTC

README

Latest Stable Version Latest Unstable Version License

Total Downloads Monthly Downloads Daily Downloads

Continuous Integration Code Coverage Type Coverage

尝试自动配置您的管理类和扩展,以便您无需手动操作。

这是对不再维护的 kunicmarko/sonata-auto-configure-bundle 的分支。

文档

安装

1. 使用 Composer 添加依赖

composer require nucleos/sonata-auto-configure-bundle

2. 为所有 Symfony 环境启用 Bundle

// bundles.php
return [
    //...
    Nucleos\SonataAutoConfigureBundle\SonataAutoConfigureBundle::class => ['all' => true],
];

配置

sonata_auto_configure:
    admin:
        suffix: Admin
        manager_type: orm
        label_catalogue: ~
        label_translator_strategy: ~
        translation_domain: ~
        group: ~
        pager_type: ~
    entity:
        namespaces:
            - { namespace: App\Entity, manager_type: orm }
    controller:
        suffix: Controller
        namespaces:
            - App\Controller\Admin

它如何工作

此 Bundle 会尝试猜测一些关于您管理类的内容。您只需创建管理类,并确保管理目录已包含在自动发现中,并且自动配置已启用。

此 Bundle 会为您的管理类标记 sonata.admin,然后我们找到所有管理类。如果自动配置已启用,我们将使用类名。如果您在配置中定义了一个后缀(默认为 Admin),我们将删除它以获取实体名称,因此如果您有 CategoryAdmin,我们将得到 Category

之后,我们检查是否存在 Admin 属性,属性比我们的猜测具有更高的优先级。如果没有定义属性或某些必需的值不存在,我们仍然会尝试猜测。

首先,我们设置标签,根据前面的示例,它将是 Category

然后,我们设置管理代码,这将是服务 ID,在我们的例子中是类名。

然后,我们尝试在您定义的命名空间列表中找到 Category 实体(默认情况下仅 App\Entity)。如果找不到实体,将抛出异常,您可能需要使用属性来定义实体。您可以按命名空间设置 manager_type 属性。

默认情况下,我们将从属性中获取 manager_type,如果它们不存在,则从命名空间定义中获取。如果您在属性中定义了实体但没有定义 manager_type,则我们将从 Bundle 配置中获取管理类型,该类型将作为 sonata_auto_configure.admin.manager_type 参数可用。

然后我们尝试猜测控制器,与实体类似,我们尝试在命名空间列表中猜测它,但我们添加了一个后缀(如在大多数情况下,人们将其命名为 CategoryController),您可以在配置中禁用它。如果没有控制器,我们将其保留为 null,sonata 将添加其默认控制器。

就是这样。我们有了定义管理类所需的所有信息,如果您在定义管理类时使用了其他标签选项,您将必须使用属性或使用 autoconfigure: false 注册管理类,如下所示

App\Admin\CategoryAdmin:
    arguments: [~, App\Entity\Category, ~]
    autoconfigure: false
    tags:
        - { name: sonata.admin, manager_type: orm, label: Category }
    public: true

属性

<?php

namespace App\Admin;

use Nucleos\SonataAutoConfigureBundle\Attribute\Admin;
use App\Controller\Admin\CategoryController;
use App\Entity\Category;
use Sonata\AdminBundle\Admin\AbstractAdmin;

#[Admin(
    label: "Category",
    managerType: "orm",
    group: "Category",
    showInDashboard: true,
    showMosaicButton: true,
    keepOpen: true,
    onTop: true,
    icon: "<i class: 'fa fa-user'></i>",
    labelTranslatorStrategy: "sonata.admin.label.strategy.native",
    labelCatalogue: "App",
    translationDomain: "messages",
    pagerType: "simple",
    controller: CategoryController::class,
    entity: Category::class,
    adminCode: "admin_code",
    autowireEntity: true,
    templates: [
        "list" => "admin/category/list.html.twig"
    ],
    children: ["app.admin.product"]
)]
final class CategoryAdmin extends AbstractAdmin
{
}

AdminExtension

<?php

namespace App\Admin;

use Nucleos\SonataAutoConfigureBundle\Attribute\AdminExtension;
use Sonata\AdminBundle\Admin\AbstractAdminExtension;

#[AdminExtension(
    global: true
)]
final class GlobalExtension extends AbstractAdminExtension
{
}
<?php

namespace App\Admin;

use Nucleos\SonataAutoConfigureBundle\Attribute\AdminExtension;
use Sonata\AdminBundle\Admin\AbstractAdminExtension;
use App\Admin\ActivityAdmin;

#[AdminExtension(
    target: ["app.admin.project", ActivityAdmin::class]
)]
final class SortableExtension extends AbstractAdminExtension
{
}