corollarium / formularium
为PHP提供自定义前端生成器的表单验证和生成
Requires
- php: >=7.3.0
- ezyang/htmlpurifier: ^4.12
- fakerphp/faker: ^1.13
- haydenpierce/class-finder: ^0.4.2
- nette/php-generator: ^3.5
- respect/validation: ^1.1
- thecodingmachine/safe: ^1.1
Requires (Dev)
- illuminate/console: ^7.16
- johnkary/phpunit-speedtrap: ^3.2
- phpstan/phpstan: ^0.12
- phpunit/phpunit: ^8
- symplify/easy-coding-standard: ^8.0
README
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代码。
赞助商
最小示例
一切尽收眼底
// 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!)。
- 代码生成器:生成接口、类或类型
- TypeScript接口
- GraphQL
- SQL
- Laravel Eloquent
- 基本前端生成器
- HTML:纯HTML
- HTMLValidation:纯HTML中的表单验证(无js)
- 未来:Nativescript
- 未来:React Native
- CSS框架
- JS/PHP框架
- Vue
- React(部分支持)
- Laravel Blade
- 未来:Angular
- JS扩展
- Parsley
- Quill编辑器
- Vuelidate部分实现
- VeeValidate部分实现
贡献 
任何贡献都受欢迎。请发送PR。
我们正在寻找有经验的React和Angular人员来开发其生成器。