solidworx/form-handler-bundle

为 Symfony 表单提供简单的表单处理

安装量: 29,144

依赖项: 2

建议者: 0

安全: 0

星标: 6

关注者: 3

分支: 1

开放问题: 0

类型:symfony-bundle

1.2.4 2024-06-04 15:06 UTC

README

Build Status

FormHandler 组件尝试通过将表单处理卸载到独立的类来简化控制器的基本表单处理。

目录

要求

FormHandler 需要 PHP 7.1+ 和 Symfony 3.0+

安装

Composer

$ composer require solidworx/form-handler-bundle:^1.0

然后在您的 Symfony 应用程序中注册该包

<?php

// app/AppKernel.php

// ...
    public function registerBundles()
    {
        $bundles = [
            // ...
            new SolidWorx\FormHandler\FormHandlerBundle(),
        ];
        
        // ...
    )

使用

表单可以有一个实现了 FormHandlerInterface 接口的类。该接口公开了一个方法,可以从中检索表单

public function getForm(FormFactoryInterface $factory, Options $options);

此方法可以返回一个标准表单类型,或者使用工厂生成表单类型。

<?php

use Symfony\Component\Form\FormFactoryInterface;
use SolidWorx\FormHandler\FormHandlerInterface;
use SolidWorx\FormHandler\Options;

class MyFormHandler implements FormHandlerInterface
{
    public function getForm(FormFactoryInterface $factory, Options $options)
    {
        // either
        return MyFormType::class;

        // or
        return $factory->create(MyFormType::class);
    }
}

使用工厂的好处是,当您需要向表单传递附加信息或选项时,例如

return $factory->create(MyFormType::class, null, ['horizontal' => true]);

要注册您的表单处理程序,将其注册为服务

services:
    my.form.handler:
        class: MyFormHandler
        tags:
            - { name: 'form.handler' }

在您的控制器中,使用 form.handler 服务来处理您的表单

<?php

class MyController extends Controller
{
    public function addAction()
    {
        return $this->get('solidworx.form_handler')->handle(MyFormHandler::class); // MyFormHandler will automatically be pulled from the container if it is tagges with `form.handler`
    }
}

这将处理表单的必要逻辑(提交表单和处理请求等)。

如果您需要处理失败的表单,则需要实现 FormHandlerFailInterface 接口

<?php

use SolidWorx\FormHandler\FormRequest;
use SolidWorx\FormHandler\FormHandlerInterface;
use SolidWorx\FormHandler\FormHandlerFailInterface;
use Symfony\Component\Form\FormErrorIterator;

class MyFormHandler implements FormHandlerInterface, FormHandlerFailInterface
{
    // ...
    public function onFail(FormRequest $formRequest, FormErrorIterator $errors, $data = null)
    {
        // Form submission has failed, probably due to a validation error.
        // Handle it here if you need specific custom logic
    }
}

如果您需要处理成功的表单提交,则需要实现 FormHandlerSuccessInterface 接口

<?php

use SolidWorx\FormHandler\FormRequest;
use SolidWorx\FormHandler\FormHandlerInterface;
use SolidWorx\FormHandler\FormHandlerSuccessInterface;

class MyFormHandler implements FormHandlerInterface, FormHandlerSuccessInterface
{
    // ...
    public function onSuccess($data, FormRequest $form)
    {
        // $data is the submitted data from the form, do something with it here
        // This will probably save info to the DB
    }
}

向表单添加选项

如果您需要向表单传递选项,可以将它们作为数组添加到 FormHandler::handle 的第二个参数中

<?php

class MyController extends Controller
{
    public function addAction()
    {
        return $this->get('solidworx.form_handler')->handle(MyFormHandler::class, ['entity' => new Blog]); // MyFormHandler will automatically be pulled from the container if it is tagges with `form.handler`
    }
}

这些选项将在 getForm 方法中作为 Options 对象可用

<?php

use Symfony\Component\Form\FormFactoryInterface;
use SolidWorx\FormHandler\FormHandlerInterface;
use SolidWorx\FormHandler\Options;

class MyFormHandler implements FormHandlerInterface
{
    public function getForm(FormFactoryInterface $factory, Options $options)
    {
        return $factory->create(MyFormType::class, $options->get('entity'));
    }
}

您还可以通过实现 FormHandlerOptionsResolver 接口来配置选项,以设置允许的选项、设置默认值、定义必需的选项等。

<?php

use Symfony\Component\OptionsResolver\OptionsResolver;
use SolidWorx\FormHandler\FormHandlerInterface;
use SolidWorx\FormHandler\FormHandlerOptionsResolver;

class MyFormHandler implements FormHandlerInterface, FormHandlerOptionsResolver
{
    // ...
    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setRequired('entity');
        $resolver->addAllowedTypes('entity', BlogEntity::class);
        $resolver->setDefault('another_options', 'myvalue');
    }
}

高级使用

这是组件的非常基础的使用。还有一些更高级的使用方法,您可以根据自己的需求定制表单的处理。

测试

要运行单元测试,请执行以下命令

$ vendor/bin/phpunit

贡献

参见 CONTRIBUTING

许可证

FormHandler 是开源软件,使用 MIT 许可证授权

有关完整的许可证,请参阅 LICENSE 文件。