pitch/form

表单操作

安装: 202

依赖者: 0

建议者: 0

安全: 0

星标: 1

关注者: 2

分支: 0

公开问题: 0

类型:symfony-bundle

v1.2.0 2022-06-22 09:29 UTC

This package is auto-updated.

Last update: 2024-09-22 14:45:47 UTC


README

简化控制器处理表单输入。

用法

注解控制器

通过注解所需的 FormType 来保持创建和处理表单输入在你的控制器之外。

namespace App\Controller;

use App\Form\MyFormType;
use Pitch\Form\Form;

class MyController
{
    #[Form(MyFormType::class)]
    public function __invoke($data)
    {
        // Just handle the data of a valid form.
        // If the form is not submitted yet or the input is invalid,
        // the controller will not be called and the
        // Symfony\Component\Form\FormInstance will be returned.
    }
}

如果已安装,此功能也支持 Doctrine Annotations

处理 FormInstance 控制器返回值

Symfony 需要控制器返回一个 Symfony\Component\HttpFoundation\Response。但您可以在 kernel.view 事件上转换其他返回值(如 FormInstance)。添加您自己的 事件订阅者 或使用 pitch/symfony-adr 添加一个 ResponseHandler。

在控制器中使用表单

就像有效表单的数据一样,FormInstance 会根据 [请求属性](https://symfony.com.cn/doc/current/components/http_foundation.html#accessing-request-data) (https://symfony.com.cn/doc/current/components/http_foundation.html#accessing-request-data) 传递给控制器。如果存在与属性同名的参数,则 [Symfony 的 RequestAttributeValueResolver](https://symfony.com.cn/doc/current/controller/argument_value_resolver.html#built-in-value-resolvers) 会将其注入到控制器中。默认情况下,属性名称为 dataform,但在发生冲突的情况下,您可以通过注解提供其他名称。

namespace App\Controller;

use App\Form\MyFormType;
use Pitch\Form\Form;
use Symfony\Component\Form\FormInterface;

class MyController
{
    #[Form(
        MyFormType::class,
        dataAttr: 'myData',
        formAttr: 'myForm',
    )]
    public function __invoke(
        Request $request,
        FormInterface $myForm,
        $myData,
    ) {
    }
}

您可以通过注解 #[Form(MyFormType::class, returnForm: false)] 或配置参数 pitch_form.returnForm: false 来防止自动返回无效或未提交的表单。

使用数据实体

namespace App\Controller;

use App\Form\MyFormType;
use App\Form\MyFormEntity;
use Pitch\Form\Form;

class MyController
{
    #[Form(
        MyFormType::class,
        entity: MyFormEntity::class,
    )]
    public function __invoke(MyFormEntity $data)
    {
    }
}

如果实体不能仅通过调用构造函数来创建,您可以将实现 Pitch\Form\FormEntityFactoryInterface 的工厂作为服务注册。

namespace App\Controller;

use App\Form\MyFormType;
use App\Form\MyFormEntity;
use Pitch\Form\Form;

class MyController
{
    #[Form(
        MyFormType::class,
        entityFactory: 'myFactoryId',
    )]
    public function __invoke(MyFormEntity $data)
    {
    }
}