nucleos / sonata-auto-configure-bundle
自动配置 Sonata Admin 的 Symfony Bundle
Requires
- php: ^8.1
- doctrine/inflector: ^2.0.4
- sonata-project/admin-bundle: ^4.7
- symfony/config: ^6.4 || ^7.0
- symfony/dependency-injection: ^6.4 || ^7.0
- symfony/http-kernel: ^6.4 || ^7.0
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-08 06:50:24 UTC
README
尝试自动配置您的管理类和扩展,以便您无需手动操作。
这是对不再维护的 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 { }