neimheadh / sonata-annotation-bundle
Symfony Bundle,用于为 Sonata Admin 添加注解。
Requires
- php: ^8.0
- doctrine/annotations: ^1.7
- sonata-project/admin-bundle: ^4.0
- symfony/config: ^5.4 || ^6.0
- symfony/dependency-injection: ^5.4 || ^6.0
- symfony/finder: ^5.4 || ^6.0
- symfony/http-kernel: ^5.4 || ^6.0
Requires (Dev)
- ext-dom: *
- ext-json: *
- ext-pdo: *
- ext-pdo_sqlite: *
- doctrine/doctrine-bundle: ^2.8
- php-coveralls/php-coveralls: ^2.5
- phpunit/phpunit: ^9.5
- sonata-project/doctrine-orm-admin-bundle: ^4.0
- symfony/browser-kit: ^5.4 || ^6.2
- symfony/http-client: ^5.4 || ^6.2
- symfony/monolog-bundle: ^3.8
- symfony/phpunit-bridge: ^5.4 || ^6.0
- symfony/translation: ^5.4 || ^6.0
- symfony/yaml: ^5.4 || ^6.0
Conflicts
README
为 Sonata Admin 添加注解。
目的是减少噪音,应该避免创建大量仅包含映射而不做其他操作的 Admin 类。将注解添加到您的模型中即可。如果您需要此 Bundle 未涵盖的功能,请创建 Admin 类。
此 Bundle 是对已归档的 KunicMarko\SonataAnnotationBundle 的分支。
文档
安装
1. 使用 Composer 添加依赖
composer require neimheadh/sonata-annotation-bundle
2. 在您的 Kernel 中注册 Bundle
return [ //... Neimheadh\SonataAnnotationBundle\SonataAnnotationBundle::class => ['all' => true], ];
配置
默认情况下,我们扫描您 src
目录中的所有文件,如果您将实体保存到其他地方,您可以更改目录
sonata_annotation: directory: '%kernel.project_dir%/src/'
如何使用
无需创建 Admin 类,只需在您的实体上添加注解即可。
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; /** * @Sonata\Admin("Category") * * @ORM\Table * @ORM\Entity */ class Category { /** * @Sonata\FormField() * @Sonata\ListField() * @Sonata\ShowField() * @Sonata\DatagridField() * * @ORM\Column(name="name", type="string", length=255) */ private $name; }
清除缓存
bin/console cache:clear
然后您将在侧边栏中看到 Admin。
注意,您还可以使用类属性
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; #[ORM\Table] #[ORM\Entity] #[Sonata\Admin("Category")] class Category { #[ORM\Column(name: "name", type: "string", length: 255)] #[Sonata\FormField()] #[Sonata\ListField()] #[Sonata\ShowField()] #[Sonata\DatagridField()] private $name; }
注解
Admin
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; use App\Controller\YourCRUDController; use App\Admin\YourAdmin; /** * @Sonata\Admin( * label="Category", * managerType="orm", * group="Category", * showInDashboard=true, * keepOpen=true, * onTop=true, * icon="<i class='fa fa-user'></i>", * labelTranslatorStrategy="sonata.admin.label.strategy.native", * labelCatalogue="App", * pagerType="simple", * controller=YourCRUDController::class, * serviceId="app.admin.category", * admin=YourAdmin::class, * code="admin_code", * defaultSort="id", * defaultPage=1, * defaultOrder="DESC", * defaultPageSize=10, * ) * * @ORM\Table * @ORM\Entity */ class Category { }
访问
如果您正在使用此处描述的角色处理器 here,您可以使用此注解为每个角色添加权限。
此注解可以在没有 Admin 注解的情况下使用。如果您为您的实体有 Admin 类,您仍然可以使用此注解。
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; /** * @Sonata\Admin("Category") * * @Sonata\Access("ROLE_CLIENT", permissions={"LIST", "VIEW", "EXPORT"}) * * @ORM\Table * @ORM\Entity */ class Category { }
添加子项
您可以在此处了解更多关于此 信息。
此注解可以在没有 Admin 注解的情况下使用。如果您为您的实体有 Admin 类,您仍然可以使用此注解。
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; /** * @Sonata\Admin("Category") * @Sonata\AddChild(class=Post::class, field="category") * * @ORM\Table * @ORM\Entity */ class Category { }
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; /** * @Sonata\Admin("Post") * * @ORM\Table * @ORM\Entity */ class Post { /** * @ORM\ManyToOne(targetEntity="Category") * @ORM\JoinColumn(name="category_id", referencedColumnName="id") */ private $category; }
表单字段
您可以使用 action 选项指定不同的字段或为创建和编辑操作相同的字段提供不同的配置。如果没有设置,字段将用于创建和编辑。除此之外,您还可以设置字段的顺序。位置 1 将是第一个渲染的字段,之后是更高的数字。如果字段没有位置,它将在所有具有位置的字段之后渲染。
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\TextareaType; /** * @Sonata\Admin("Category") * * @ORM\Table * @ORM\Entity */ class Category { /** * @Sonata\FormField( * action="create", * type="", * options={}, * fieldDescriptionOptions={}, * position=1 * ) * * @ORM\Column(name="name", type="string", length=255) */ private $name; /** * @Sonata\FormField( * type="", * options={}, * fieldDescriptionOptions={}, * position=2 * ) * * @ORM\Column(name="description", type="string", length=255) */ private $description; /** * @Sonata\FormField( * action="create", * type=TextType::class * ) * * @Sonata\FormField( * action="edit", * type=TextareaType::class * ) * * @ORM\Column(name="something", type="string", length=255) */ private $something; }
表单字段也可以通过 formFields
类 Admin
注解属性在类级别添加
// ... /** * @Sonata\Admin( * name="Category", * formFields={ * "name": @Sonata\FormField ( * action="create", * type="", * options={}, * fieldDescriptionOptions={}, * position=1 * ), * "description": @Sonata\FormField ( * type="", * options={}, * fieldDescriptionOptions={}, * position=2 * ), * ) */ class Category { //... }
默认情况下,如果配置了任何字段,则所有字段都将可用。
显示字段
您可以为字段设置顺序。位置 1 将是第一个渲染的字段,之后是更高的数字。如果字段没有位置,它将在所有具有位置的字段之后渲染。
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; /** * @Sonata\Admin("Category") * * @ORM\Table * @ORM\Entity */ class Category { /** * @Sonata\ShowField( * type="", * fieldDescriptionOptions={}, * position=1 * ) * * @ORM\Column(name="name", type="string", length=255) */ private $name; /** * @Sonata\ShowField() */ public function showThis(): string { return 'show value'; } }
显示字段也可以通过 showFields
类 Admin
注解属性在类级别添加
<?php // ... /** * @Sonata\Admin( * name="Category", * showFields={ * "name": @Sonata\ShowField( * type="", * fieldDescriptionOptions={}, * position=1 * ) * } * ) */ class Category { // ... }
默认情况下,如果配置了任何字段,则所有字段都将可用。
显示关联字段
您可以为字段设置顺序。位置 1 将是第一个渲染的字段,之后是更高的数字。如果字段没有位置,它将在所有具有位置的字段之后渲染。
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; /** * @Sonata\Admin("Category") * * @ORM\Table * @ORM\Entity */ class Category { /** * @Sonata\ShowAssociationField( * field="name", * type="", * fieldDescriptionOptions={}, * position=1 * ) * * @Sonata\ShowAssociationField( * field="email", * type="", * fieldDescriptionOptions={}, * position=1 * ) * * @ORM\ManyToOne(targetEntity="Owner") * @ORM\JoinColumn(name="owner_id", referencedColumnName="id") */ private $owner; }
列表字段
您可以为字段设置顺序。位置 1 将是第一个渲染的字段,之后是更高的数字。如果字段没有位置,它将在所有具有位置的字段之后渲染。
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; /** * @Sonata\Admin("Category") * * @ORM\Table * @ORM\Entity */ class Category { /** * @Sonata\ListField(identifier=true) * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @Sonata\ListField( * type="", * fieldDescriptionOptions={}, * identifier=false, * position=1 * ) * * @ORM\Column(name="name", type="string", length=255) */ private $name; /** * @Sonata\ListField(position=1) */ public function listThis(): string { return 'list value'; } }
列表字段也可以通过 listFields
类 Admin
注解属性在类级别添加
// ... /** * @Sonata\Admin( * listFields= { * "id": @Sonata\ListField(identifier=true), * "name": @Sonata\ListField( * type="", * fieldDescriptionOptions={}, * identifier=false, * position=1 * ) * } * ) */ class Category { // ... }
默认情况下,如果配置了任何字段,则所有字段都将可用。
列表关联字段
您可以为字段设置顺序。位置 1 将是第一个渲染的字段,之后是更高的数字。如果字段没有位置,它将在所有具有位置的字段之后渲染。
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; /** * @Sonata\Admin("Category") * * @ORM\Table * @ORM\Entity */ class Category { /** * @Sonata\ListAssociationField( * field="name", * type="", * fieldDescriptionOptions={}, * identifier=false, * position=1 * ) * * @Sonata\ListAssociationField( * field="email", * type="", * fieldDescriptionOptions={}, * identifier=false * ) * * @ORM\ManyToOne(targetEntity="Owner") * @ORM\JoinColumn(name="owner_id", referencedColumnName="id") */ private $owner; }
数据网格字段
您可以为字段设置顺序。位置 1 将是第一个渲染的字段,之后是更高的数字。如果字段没有位置,它将在所有具有位置的字段之后渲染。
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; /** * @Sonata\Admin("Category") * * @ORM\Table * @ORM\Entity */ class Category { /** * @Sonata\DatagridField( * type="", * fieldDescriptionOptions={}, * filterOptions={}, * fieldType="", * fieldOptions={}, * position=1 * ) * * @ORM\Column(name="name", type="string", length=255) */ private $name; }
列表字段也可以通过 datagridFields
类 Admin
注解属性在类级别添加
// ... /** * @Sonata\Admin( * datagridFields= { * "name": @Sonata\DatagridField ( * type="", * fieldDescriptionOptions={}, * filterOptions={}, * fieldType="", * fieldOptions={}, * position=1 * ) * } * ) */ class Category { // ... }
默认情况下,如果配置了任何字段,则所有字段都将可用。
数据网格关联字段
您可以为字段设置顺序。位置 1 将是第一个渲染的字段,之后是更高的数字。如果字段没有位置,它将在所有具有位置的字段之后渲染。
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; /** * @Sonata\Admin("Category") * * @ORM\Table * @ORM\Entity */ class Category { /** * @Sonata\DatagridAssociationField( * field="name", * type="", * fieldDescriptionOptions={}, * filterOptions={}, * fieldType="", * fieldOptions={}, * position=1 * ) * * @Sonata\DatagridAssociationField( * field="email", * type="", * fieldDescriptionOptions={}, * filterOptions={}, * fieldType="", * fieldOptions={} * ) * * @ORM\ManyToOne(targetEntity="Owner") * @ORM\JoinColumn(name="owner_id", referencedColumnName="id") */ private $owner; }
导出字段
您可以将注解添加到您想要导出的字段和方法上,您还可以添加字段的标签,如果留空,则将使用字段名称作为标签。
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; /** * @Sonata\Admin("Category") * * @ORM\Table * @ORM\Entity */ class Category { /** * @Sonata\ExportField() * * @ORM\Column(name="name", type="string", length=255) */ private $name; /** * @Sonata\ExportField("Custom Name") * * @ORM\Column(name="tag", type="string", length=255) */ private $tag; /** * @Sonata\ExportField() */ public function exportThis(): string { return 'export value'; } }
默认情况下,如果配置了任何字段,则所有字段都将可用。
导出关联字段
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; /** * @Sonata\Admin("Category") * * @ORM\Table * @ORM\Entity */ class Category { /** * @Sonata\ExportAssociationField( * field="name", * label="Owner" * ) * * @Sonata\ExportAssociationField( * field="email", * label="Email" * ) * * @ORM\ManyToOne(targetEntity="Owner") * @ORM\JoinColumn(name="owner_id", referencedColumnName="id") */ private $owner; }
导出格式
您可以自定义您想要允许的导出格式,如果此注解不存在,则显示所有格式。
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; /** * @Sonata\Admin("Category") * * @Sonata\ExportFormats({"json", "xml"}) * * @ORM\Table * @ORM\Entity */ class Category { /** * @Sonata\ExportField() * * @ORM\Column(name="name", type="string", length=255) */ private $name; }
添加路由
向您的 Admin 类添加自定义路由
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; use App\Controller\YourCRUDController; /** * @Sonata\Admin( * label="Category", * controller=YourCRUDController::class * ) * * @Sonata\AddRoute("import") * @Sonata\AddRoute(name="send_mail", path="{id}/send_mail") * * @ORM\Table * @ORM\Entity */ class Category { }
删除路由
删除已存在的路由
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; use App\Controller\YourCRUDController; /** * @Sonata\Admin( * label="Category", * controller=YourCRUDController::class * ) * * @Sonata\RemoveRoute("edit") * * @ORM\Table * @ORM\Entity */ class Category { }
操作按钮
这将在列表视图中添加一个按钮,紧邻你的添加按钮。点击这里,你可以查看模板应该如何显示。
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; use App\Controller\YourCRUDController; /** * @Sonata\Admin( * label="Category", * controller=YourCRUDController::class * ) * * @Sonata\AddRoute(name="import", path="/import") * * @Sonata\ActionButton("import_action_button.html.twig") * * @ORM\Table * @ORM\Entity */ class Category { }
仪表板操作
这将在该实体的仪表板块中添加一个按钮。点击这里,你可以查看模板应该如何显示。
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; use App\Controller\YourCRUDController; /** * @Sonata\Admin( * label="Category", * controller=YourCRUDController::class * ) * * @Sonata\AddRoute(name="import", path="/import") * * @Sonata\DashboardAction("import_dashboard_button.html.twig") * * @ORM\Table * @ORM\Entity */ class Category { }
列表操作
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; use App\Controller\YourCRUDController; /** * @Sonata\Admin( * label="Category", * controller=YourCRUDController::class * ) * * @Sonata\AddRoute(name="import", path="/import") * * @Sonata\ListAction("show") * @Sonata\ListAction("edit") * @Sonata\ListAction("delete") * @Sonata\ListAction(name="import", options={"template"="import_list_button.html.twig"}) * * @ORM\Table * @ORM\Entity */ class Category { }
数据网格值
如此处所述。
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; use App\Controller\YourCRUDController; /** * @Sonata\Admin("Category") * * @Sonata\DatagridValues({"_sort_by":"p.name"}) * * @ORM\Table * @ORM\Entity */ class Category { /** * @ORM\Column(name="name", type="string", length=255) */ private $name; }
扩展 Admin
有时你可能需要做一些自定义操作,而这个包无法帮助你,但你仍然希望使用注解来处理其他大部分内容。你可以扩展我们的管理类Neimheadh\SonataAnnotationBundle\Admin\AnnotationAdmin
,并覆盖你想要的方法。
<?php namespace App\Admin; use Neimheadh\SonataAnnotationBundle\Admin\AnnotationAdmin; class YourAdmin extends AnnotationAdmin { //do what you want }
然后在你的实体中提供这个类。
<?php namespace App\Entity; use Doctrine\ORM\Mapping as ORM; use Neimheadh\SonataAnnotationBundle\Annotation\Sonata; use App\Admin\YourAdmin; /** * @Sonata\Admin( * label="Category", * admin=YourAdmin::class * ) * * @ORM\Table * @ORM\Entity */ class Category { }