unclecheese / silverstripe-graphql-forms
SilverStripe 表单在 graphql 中的原型。
Requires
- silverstripe/admin: ^1.0
- silverstripe/framework: ^4.0
- silverstripe/graphql: 4.x-dev
Requires (Dev)
- phpunit/phpunit: ^5.7
- squizlabs/php_codesniffer: ^3.0
This package is auto-updated.
Last update: 2024-09-10 09:24:31 UTC
README
在 graphql 中实现 FormSchema
的简单方法。
安装
$ composer require unclecheese/silverstripe-graphql-forms:dev-master
使用
在您的模式配置中注册您的表单
*app/_graphql/config.yml
registeredForms:
- 'MyProject\Pages\ContactPageController.ContactForm'
在此示例中,键 ContactForm
是您将在 graphql 中的 Form
查询中传递的表单名称(它是一个枚举)。
值可以采用多种不同的实现。在此处,'MyProject\Pages\ContactPageController.ContactForm'
指的是
ContactPageController.php
namespace MyProject\Pages; class ContactPageController extends Controller { public function ContactForm() { // return Form instance } }
您还可以使用完全限定的 Form
子类
ContactForm: 'MyProject\Forms\ContactForm'
您还可以将其映射到已注册到查询创建器的 FormFactoryInterface
的方法上(见下文)。
ContactForm: 'myMethod'
与 Userforms 的使用
如果您使用 silverstripe/userforms
在 CMS 中生成表单,此模块包含一个专门的表单工厂,允许您注册这些表单。因为它们都共享相同的控制器类,所以您也可以通过链接或 ID 来引用这些表单。
MyCMSForm: 'who-we-are/contact-us'
或者,您可以使用 ID
MyCMSForm: 45
表单工厂
默认情况下,由于在 FormQueryCreator
中注册了 DefaultFormFactory
,表单是按照上述命名约定生成的。它的 getFormByName
函数将映射解析为实际的 Form
对象。
如果您有自定义生成表单的方式,只需注册一个新的工厂。
class MyFormFactory implements FormFactoryInterface { public function getFormByName(string $name): ?Form { // Get a Form based on $name } }
此外,要直接将方法映射到表单,您可以子类化 DefaultFormFactory
。
class MyDefaultFormFactory extends DefaultFormFactory { public function MyForm() { // return instance of MyForm. The parent getFormByName() function checks if // this method is defined before advancing through any other logic. } }
别忘了注册您的表单工厂!
SilverStripe\Core\Injector\Injector:
UncleCheese\GraphQLForms\FormFactoryRegistry:
properties:
factories:
myFactory: '%$MyProject\MyFormFactory'
查询
query {
form(name: MyForm) {
schema {
fields {
id
name
type
title
# Recursive, for composite fields
children {
name
type
title
}
}
actions {
name
title
}
}
}
}
注意事项
- 生成表单的方法必须是确定性的!不能根据状态隐藏和显示字段(至少目前不能)。
- 如果您使用显式的
Form
子类实例,它需要通过singleton()
实例化。确保任何必需的构造函数参数都自动注入。 - 不做任何复杂的操作,比如组合字段
- TODO:突变,表单提交
- 文件上传?停止。