corollarium/formularium

为PHP提供自定义前端生成器的表单验证和生成

v0.10.2 2021-09-29 17:57 UTC

README

Build Status Code Coverage Latest Stable Version Total Downloads License Scrutinizer Code Quality

Formularium (完整文档) 是从统一模型描述生成的PHP类型化代码生成器。当你每次更改模型时,是否厌倦了在多个地方更新代码?制造错误和错误,或者忘记更改第8个文件?Formularium将会

  • 生成HTML/JS/TS代码,如表单、视图和多个目标JS和CSS框架的元素
  • 为模型描述(如SQL表、TypeScript接口、GraphQL类型)生成后端代码
  • 在PHP中验证数据

Formularium已经实现了一些不同语言和CSS/JS框架的生成器,以及后端和前端验证器,为您抽象代码。它很容易扩展以针对您喜欢的语言或框架。

如果您正在寻找完全集成的后端/前端脚手架和验证,Modelarium就是您想要的,它为Laravel提供了绑定。Formularium是Modelarium使用的底层生成器。

哲学

Formularium基于两个原则。

您的数据不仅仅是字符串。为您的字段指定类型。

Formularium实现了高级数据类型,允许您指定每个字段确切期望的内容。使用定义良好的类型,您可以轻松生成用于创建、验证和生成表单的代码。一个标题不是一个纯字符串:它是一个具有最小和最大长度、如何渲染等说明的数据类型。

创建新数据类型也很容易,无论是从头开始还是扩展提供的基类型。

代码生成可能无法处理100%的情况,但它应该让您的100%的生活变得简单。

如果整个应用程序可以轻松通过代码生成,我们早就这么做了。它们不能这么做的原因是,有很多细节不能轻易压缩成简单的表达式。Formularium在本质上是一个代码压缩器:它从简化的模型描述生成代码。

对于任何无损压缩器,某些描述在压缩后可能比原始描述更长。Formularium不追求处理所有无限可能的情况。它为您生成简单、易于修改或扩展的代码,并且不会妨碍您。然后您可以根据需要扩展、覆盖甚至手动更改生成的代码。

在最佳情况下,您可以自动编写所有代码。在最坏的情况下,您只需覆盖不合适的代码。但无论如何,它都不会妨碍您:它在开发时生成纯代码。

前端生成示例

相同的PHP模型在Bootstrap、Bulma、Materialize和Buefy中自动生成前端表单的示例。点击图片查看实时HTML。

这些表单都是从同一简单的数据结构生成的,该结构使用数据类型和HTML生成器(如标签)的通用信息描述其字段。模型描述可以序列化为JSON。

如果您正在寻找一个完全集成的后端/前端脚手架和验证工具,Modelarium就是您想要的。Formularium是Modelarium使用的底层生成器。

入门指南

查看

为什么你应该使用Formularium

  • 类型化数据系统:更改数据类型,并自动在您的数据上反映。所以您的字段从30个字符增长到50个?更改数据类型以反映它,并一次性更新所有内容。
  • 自动验证:自动且安全地验证您的数据。
  • 组件验证器:轻松创建新的数据类型并添加新的验证器。
  • HTML抽象:抽象您的CSS框架,以便从代码中简单生成元素,如按钮或表格。
  • GraphQL描述:在GraphQL SDL中声明您的模型,并免费获得脚手架。您甚至不需要为Formularium编写PHP代码。与Modelarium配合使用效果更佳。
  • 快速生成前端脚手架:停止编写冗长的HTML,并手动生成表单/卡片等。让这个工具为您完成所有基本工作,如果需要的话,再进行设计上的精炼。
  • 组件生成:生成带有相应HTML模板的React和Vue组件。
  • 自动后端代码生成器:SQL/GraphQL/TypeScript/Laravel模型。使用SQL和Laravel类型将您的模型转换为数据库描述,或快速生成GraphQL和JS代码。

赞助商

Corollarium

最小示例

一切尽收眼底

// set your framework composition statically.
// For example, this builds HTML using Bootstrap as CSS and the Vue framework.
$composer = new FrameworkComposer(['HTML', 'Bootstrap', 'Vue']);

// first, you can just generate simple standalone elements, like a button:
echo $composer->element(
    'Button',
    [
        Element::LABEL => 'Submit',
        Element::SIZE => Element::SIZE_LARGE,
    ]
);

// build a model from data description. You can use a JSON file instead, or a GraphQL file.
$modelData = new Model(
    'TestModel',
);
$modelData->appendField(new Field(
    'myString',
    Datatype_string::class,
    [
        Renderable::LABEL => 'This is some string',
        Renderable::COMMENT => 'At least 3 characters but no more than 10',
        Renderable_string::NO_AUTOCOMPLETE => true,
        Renderable::PLACEHOLDER => "Type here",
        Renderable::ICON_PACK => 'fas',
        Renderable::ICON => 'fa-check'
    ],
    [
        MinLength::class => [
            'value' => 3,
        ],
        MaxLength::class => [
            'value' => 10,
        ],
        Datatype::REQUIRED => [
            'value' => true,
        ]
    ],
))->appendField(new Field(
    'someInteger',
    'integer',
    [
        Renderable_number::STEP => 2,
        Renderable_string::NO_AUTOCOMPLETE => true,
        Renderable::LABEL => 'Some integer',
        Renderable::COMMENT => 'Between 4 and 30',
        Renderable::PLACEHOLDER => "Type here"
    ],
    [
        Min::class => [
            'value' => 4,
        ],
        Max::class => [
            'value' => 30,
        ],
        Datatype::REQUIRED => [
            'value' => true,
        ]
    ],
))->appendField(new Field(
    'myaaaaa',
    'aaaaa',
    [
        Renderable::LABEL => 'This is a custom datatype',
        Renderable::COMMENT => 'Fill this with aaaaa to validate properly',
        Renderable_string::NO_AUTOCOMPLETE => true,
        Renderable::PLACEHOLDER => "Type aaaaa here"
    ],
    [
        Datatype::REQUIRED => [
            'value' => true,
        ]
    ],
));

// validate some data
$data = [
    'myString' => 'some string here',
    'someInteger' => 32
];
$validation = $model->validate($data);
if (!empty($validation['errors'])) {
    foreach ($validation['errors'] as $fieldName => $error) {
        echo "$fieldName has an error: $error\n";
    }
}
// get data after validation
$validated = $validation['validated'];

// render a form
echo $model->editable($data);

// render a view
echo $model->viewable($data);

// generate a typescript interface, like `type TestModel { ... }`
$codeGenerator = new \Formularium\CodeGenerator\Typescript\CodeGenerator();
echo  $codeGenerator->type($model);

输出是一个很棒的HTML,您可以将其用作表单的基础。请参阅厨房水槽示例中生成的HTML。

支持的前端生成器

Formularium以这种方式构建,可以链式生成器,因此您可以组合一个基本的HTML表单生成器、CSS框架和JS验证器,或者可能将表单放入Vue或React组件中。我们提供了一些前端插件,您也可以轻松扩展自己的(并提交PR!)。

贡献 contributions welcome

任何贡献都受欢迎。请发送PR。

我们正在寻找有经验的React和Angular人员来开发其生成器。