sherlockode/crud-bundle

用于生成 CRUD 的包

v0.1.1 2024-03-14 10:17 UTC

This package is auto-updated.

Last update: 2024-09-14 11:18:12 UTC


README

概述

本包生成基本的 CRUD。

安装

使用 composer 安装此包

$ composer require sherlockode/crud-bundle

生成基本网格视图

# config/packages/sherlockode_crud.yaml

sherlockode_crud:
    crud:
        user:
            config:
                class: App\Entity\User
                form: App\Form\Type\UserType
            grid:
                fields:
                    name:
                        label: crud.user.name #translation key
                    surname:
                        label: crud.user.surname
                    is_active:
                        label: crud.user.active
                        type: boolean # you can define a specific type if you need. See the section bellow 
                    created_at:
                        label: crud.user.created_at
                        type: date
                        options:
                            format: d-m-Y # you can customise the date format
                actions: 
                    update: ~
                    delete: ~
                settings: 
                    page_size: 20 #the number of elements by page, 20 by default
# sherlockode_crud_routing.yaml

app_admin_user:
    resource: |
        base_name: sherlockode_crud
        resource_name: user 
    type: sherlockode_crud.resource
    prefix: /admin

自定义

需要自定义操作或字段?您可以轻松地定义自己的

# config/packages/sherlockode_crud.yaml

sherlockode_crud:
    templates:
        action:
            up_and_down: '@SherlockodeCrud/common/grid/action/up_and_down.html.twig'
        field:
            custom_field: '@SherlockodeCrud/common/grid/field/custom_field.html.twig'

    # now, you can use them like this :
    crud: 
        user:
            # ...
            grid:
                fields:
                    surname:
                        label: crud.user.email
                        type: custom_field
                actions:
                    up_and_down: ~

您需要在网格中用对象而不是属性值?

# config/packages/sherlockode_crud.yaml

sherlockode_crud:
    crud: 
        user:
            # ...
            grid:
                fields:
                    surname:
                        label: crud.user.email
                        path: . #use '.' to send the object instead of the property value

您需要在网格上添加过滤器?

# config/packages/sherlockode_crud.yaml

sherlockode_crud:
    crud:
        user:
            # ...
            grid:
                filters:
                    name:
                        type: string
                        label: Label or custom translation key

您需要为网格创建自定义查询?

# config/packages/sherlockode_crud.yaml

sherlockode_crud:
    crud:
        user:
            # ...
            grid:
                repository:
                    method: yourQueryBuilder
  • 在此示例中,在 UserRepository 中,您需要一个名为 yourQueryBuilder 的函数
  • yourQueryBuilder 函数需要返回一个 QueryBuilder 对象

您需要过滤器?

该包具有基本的过滤器

  • 字符串
  • 布尔值
  • 浮点数
  • 货币
  • 日期
  • 日期范围
  • 实体

实体过滤器需要更多配置

# config/packages/sherlockode_crud.yaml

sherlockode_crud:
    crud:
        user:
            # ...
            grid:
                filters:
                    category:
                        type: entity
                        options:
                            class: App\Entity\Category
                            choice_label: name

要添加一些过滤器

# config/packages/sherlockode_crud.yaml

sherlockode_crud:
    crud:
        user:
            # ...
            grid:
                filters:
                    name:
                        type: string #the filter name
                    createdAt:
                        type: date_range

您需要自定义过滤器?

如果您需要一个不存在的过滤器,创建它!

创建您自己的过滤器类和过滤器类型类,在此示例中为 MyCustomFilterMyCustomFilter 需要实现 FilterInterface

现在您需要设置新过滤器模板

# config/packages/sherlockode_crud.yaml

sherlockode_crud:
    templates:
        filter:
            my_custom_filter: 'Grid\Filter\my_custom_filter.html.twig'
    crud:
        user:
            # ...
            grid:
                filters:
                    name:
                        type: my_custom_filter

您需要对网格进行排序?

# config/packages/sherlockode_crud.yaml

sherlockode_crud:
    crud:
        user:
            # ...
            grid:
                sorting:
                    name: asc
                    surname: desc

您需要让用户选择排序顺序?

# config/packages/sherlockode_crud.yaml

sherlockode_crud:
    crud:
        user:
            grid:
                fields:
                    name:
                        label: crud.user.email
                        sortable: ~ #set the column sortable

您需要更改资源创建或编辑后的重定向?

# sherlockode_crud_routing.yaml

app_admin_user:
    resource: |
        redirect_after_create: index 
        redirect_after_update: update 
        base_name: sherlockode_crud
        resource_name: user 
    type: sherlockode_crud.resource
    prefix: /admin

默认情况下,在资源创建或编辑后,您将被重定向到更新操作

您需要为路由创建自定义模板?

# sherlockode_crud_routing.yaml

app_admin_user:
    resource: |
        base_name: sherlockode_crud
        resource_name: user
        templates: "User"
    type: sherlockode_crud.resource
    prefix: /admin
  • 在您的模板项目文件夹中,请确保您有 User 目录。
  • 如果您只需要为索引操作创建自定义模板,请命名为 index.html.twig,其他路由将使用默认模板渲染

您只想创建索引路由,而不是所有路由?

# sherlockode_crud_routing.yaml

app_admin_user:
    resource: |
        base_name: sherlockode_crud
        resource_name: user
        only: [index]
    type: sherlockode_crud.resource
    prefix: /admin

您想创建所有路由(除了删除)?

# sherlockode_crud_routing.yaml

app_admin_user:
    resource: |
        base_name: sherlockode_crud
        resource_name: user
        except: [delete]
    type: sherlockode_crud.resource
    prefix: /admin

您需要在操作之前检查权限?

# sherlockode_crud_routing.yaml

app_admin_user:
    resource: |
        base_name: sherlockode_crud
        resource_name: user
        permission: true
    type: sherlockode_crud.resource
    prefix: /admin

现在为每个操作创建自己的投票者

  • 索引
  • 创建
  • 编辑
  • 删除

属性以 resource_name 为前缀。在此示例中,它是 user_index

您想发送一些变量?

# sherlockode_crud_routing.yaml

app_admin_user:
    resource: |
        base_name: sherlockode_crud
        resource_name: user
        vars: 
            global:
                icon: bi bi-person-fill

在此示例中,我们向所有路径发送一个图标。

如果您只想针对特定路径执行此操作

# sherlockode_crud_routing.yaml

app_admin_user:
    resource: |
        base_name: sherlockode_crud
        resource_name: user
        vars: 
            index:
                icon: bi bi-person-fill

您需要删除删除确认页面?

# config/packages/sherlockode_crud.yaml

sherlockode_crud:
    crud:
        user:
            config:
                delete_confirmation: false

您需要在显示视图中添加一些信息?

# config/packages/sherlockode_crud.yaml

sherlockode_crud:
    crud:
        user:
            show:
                name:
                    type: string
                is_active:
                    type: boolean
                category.name:
                    type: string
                created_at:
                    type: date
                    options:
                        format: d-m-Y

您需要更改翻译域?

# config/packages/sherlockode_crud.yaml

sherlockode_crud:
    translation_domain: yourDomain

您需要禁用翻译域?

# config/packages/sherlockode_crud.yaml

sherlockode_crud:
    translation_domain: false
    crud:
        user:
            # ...
            grid:
                fields:
                    name:
                        label: My Name #you can use a translation key or the label value if translation domain is false

如果您需要更具体,您可以禁用翻译或为某些网格设置自定义翻译域

# config/packages/sherlockode_crud.yaml

sherlockode_crud:
    crud:
        user:
            config:
                translation_domain: false #or yourDomain

如果您为网格设置了翻译域,则该值将替换全局值

您需要向视图发送数据?

在 ResourceControllerDataEvent 中,您有多个操作

  • ResourceControllerDataEvent::SHOW
  • ResourceControllerDataEvent::CREATE
  • ResourceControllerDataEvent::UPDATE
  • ResourceControllerDataEvent::DELETE_CONFIRMATION

在 ResourceController,在显示、创建、更新和删除确认操作中,在页面渲染之前会触发一个事件。

如果您需要向视图发送数据,您可以创建一个监听器。

# src/EventListener/ResourceListener.php

class ResourceListener implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            ResourceControllerDataEvent::UPDATE => 'update',
        ];
    }

    public function update(ResourceControllerDataEvent $event): void
    {
        // send custom data to the view
        $event->setData([]);
    }
}

在视图中,数据变量将包含您在上例中发送的数据。

您需要阻止刷新?

在 ResourceControllerEvent 中,您有多个操作

  • ResourceControllerEvent::BEFORE_CREATE
  • ResourceControllerEvent::BEFORE_UPDATE
  • ResourceControllerEvent::BEFORE_DELETE

在ResourceController中,在创建、更新和删除操作中,在执行flush之前会触发一个事件。

如果您需要取消flush,可以创建一个监听器

# src/EventListener/ResourceListener.php

class ResourceListener implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            ResourceControllerEvent::BEFORE_UPDATE => 'update',
        ];
    }

    public function update(ResourceControllerDataEvent $event): void
    {
        $event->setCancelProcess(true);
        
        // optional message, by default, a translation key is generated 
        // sherlockode_crud.crud_name.update.cancel
        $event->setMessage('your message');
    }
}