answear / liform-bundle
Liform 扩展包:将 Symfony 表单转换为 JSON Schema
Requires
- answear/liform: ^0.21.0
- symfony/config: ^6.0|^7.0
- symfony/dependency-injection: ^6.0|^7.0
- symfony/http-kernel: ^6.0|^7.0
Requires (Dev)
- phpstan/phpstan: ^1.8
Replaces
This package is auto-updated.
Last update: 2024-09-14 09:19:52 UTC
README
将 Liform 集成到 Symfony 的扩展包。Liform 是一个将 Symfony 表单序列化为 JSON Schema 的库。适用于 liform-react 或 json-editor,或任何基于 json-schema 的表单生成器。
维护与客户端技术(如 JavaScript)中的表单匹配的 Symfony 表单非常令人烦恼。维护此类表单的文档也很麻烦。而且,它也很容易出错。
LiformBundle 生成一个 JSON Schema 表示,充当文档,可用于验证您的数据,如果需要,还可以使用生成器生成表单。
安装
首先,请注意,在 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 Schema
$form = $this->createForm(CarType::class, $car, ['csrf_protection' => false]); $schema = json_encode($this->get('liform')->transform($form));
并且 $schema
将包含一个 JSON Schema 表示,如下所示
{ "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 的目标是从表单中提取尽可能多的数据,以便在 Schema 中有完整的表示,包括验证和 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