startsevdenis/liform-bundle

Liform 扩展包:将 Symfony 表单转换为 JSON 模式

安装次数: 4,499

依赖项: 0

建议者: 0

安全性: 0

星标: 0

关注者: 0

分支: 43

类型:symfony-bundle

v0.17.5 2022-08-10 08:37 UTC

README

将 Liform 集成到 Symfony 的扩展包。Liform 是一个将 Symfony 表单序列化为 JSON 模式 的库。适用于 Liformliform-react,或任何基于 json-schema 的其他表单生成器。

维护与客户端技术(如 JavaScript)匹配的 Symfony 表单非常令人烦恼。维护此类表单的文档也很麻烦。而且,这很容易出错。

LiformBundle 生成 JSON 模式表示,作为文档使用,可用于验证您的数据,并且如果您想的话,还可以使用生成器生成表单。

安装

首先,请注意,在 Limenius/symfony-react-sandbox 上有一个完整的示例,包括 React、Webpack 和 Symfony 标准版,以及此扩展包的示例实现,供您使用。

您可以自由地克隆它、运行它、进行实验,并将所需的组件复制到您的项目中。因为此扩展包主要关注前端方面,所以您应该有一个兼容的前端设置。

步骤 1:下载扩展包

打开控制台,导航到您的项目目录,并执行以下命令以下载此扩展包的最新稳定版本

$ composer require limenius/liform-bundle

此命令需要您全局安装了 Composer,如 Composer 文档的 安装章节 中所述。

步骤 2:启用扩展包

然后,通过在您的项目的 app/AppKernel.php 文件中添加以下行来启用扩展包

// app/AppKernel.php

// ...
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            // ...

            new Limenius\LiformBundle\LimeniusLiformBundle(),
        );

        // ...
    }

    // ...
}

用法

将表单序列化为 JSON 模式

        $form = $this->createForm(CarType::class, $car, ['csrf_protection' => false]);
        $schema = json_encode($this->get('liform')->transform($form));

$schema 将包含一个类似以下的 JSON 模式表示

{  
   "title":null,
   "properties":{  
      "name":{  
         "type":"string",
         "title":"Name",
         "propertyOrder":1
      },
      "color":{  
         "type":"string",
         "title":"Color",
         "attr":{  
            "placeholder":"444444"
         },
         "default":"444444",
         "description":"3 hexadecimal digits",
         "propertyOrder":2
      },
      "drivers":{  
         "type":"array",
         "title":"hola",
         "items":{  
            "title":"Drivers",
            "properties":{  
               "firstName":{  
                  "type":"string",
                  "propertyOrder":1
               },
               "familyName":{  
                  "type":"string",
                  "propertyOrder":2
               }
            },
            "required":[  
               "firstName",
               "familyName"
            ],
            "type":"object"
         },
         "propertyOrder":3
      }
   },
   "required":[  
      "name",
      "drivers"
   ]
}

提取到 JSON-schema 的信息

Liform 的目标是尽可能从表单中提取数据,以便在模式中有一个完整的表示,包括验证和 UI 提示。目前支持以下选项。

有关更多详细信息,请参阅 Liform 文档

使用自己的转换器

Liform 通过递归检查表单,为每个子项找到(解析)正确的转换器,并使用该转换器构建相应的 json-schema 片段。因此,如果您想修改特定表单类型的转换方式,您可以添加一个转换器,并将其配置为应用于具有特定 block_prefix 的所有子项。
为此,您应该创建一个新的服务定义,并添加 liform.transformer 标签。您需要通过设置标签的 form_type 属性来指定您的转换器将应用于哪些表单类型。

在下面的示例中,我们重用了 StringTransformer 类。通过指定标签的 widget 属性,我们可以将转换器限制为仅适用于具有该特定小部件的类型。

services:
    app.liform.file_type.transformer:
        class: "%liform.transformer.string.class%"
        parent: Limenius\Liform\Transformer\AbstractTransformer
        tags:
            - { name: liform.transformer, form_type: file, widget: file_widget }

当然,您可以使用自己的 Transformer 类,但请确保在实现时实现了所需的 Limenius\Liform\Transformer\TransformerInterface

扩展默认行为

除了添加用于自定义特定表单类型序列化的自定义转换器外,Liform 还允许您添加扩展来自定义所有类型的默认行为。
以下示例中,我们使用扩展来向表示表单的 action 参数的架构添加一个 submit_url 属性。

<?php

use Limenius\Liform\Transformer\ExtensionInterface;
use Symfony\Component\Form\FormInterface;

class FormDataExtension implements ExtensionInterface
{
    /**
     * @param FormInterface $form
     * @param array         $schema
     *
     * @return array
     */
    public function apply(FormInterface $form, array $schema)
    {
        if (!$form->isRoot()) {
            return $schema;
        }

        if (!$form->getConfig()->hasOption('action')) {
            return $schema;
        }

        $schema['submit_url'] = $form->getConfig()->getOption('action');

        return $schema;
    }
}

请确保您的扩展类实现了所需的 Limenius\Liform\Transformer\ExtensionInterface 接口。要注册扩展;创建一个新的服务定义,并在其中添加 liform.extension 标签。

services:
    app.liform.form_data.extension:
        class: MyProject\Application\Liform\FormDataExtension
        tags:
            - { name: liform.extension }

序列化初始值

此扩展注册了一个正常化器,将 FormView 类序列化为一个数组,该数组包含与您的 json-schema 匹配的初始值。以下示例展示了如何在控制器操作中使用此功能。

$serializer = $this->get('serializer');
$initialValues = $serializer->normalize($form);

序列化错误

此扩展注册了一个正常化器,将包含错误的表单序列化为一个数组。这部分内容毫不客气地借鉴自 FOSRestBundle。复制以下语句以使用此功能

$serializer = $this->get('serializer');
$errors = $serializer->normalize($form);

包含正常化表单错误的数组格式与 liform-react 包兼容。

许可证

此扩展是在 MIT 许可证下发布的。有关完整的版权和许可信息,请参阅随源代码一起分发的 LICENSE 文件。

LICENSE.md

致谢

使用解析器和减少器转换表单的技术灵感来源于 Symfony Console Form