mitom/form-handler-bundle

symfony 的表单处理器组件。

0.2 2014-11-20 11:18 UTC

This package is not auto-updated.

Last update: 2024-09-24 04:09:53 UTC


README

该组件旨在简化表单管理和提交,并在其提交上提供一定程度的抽象。使用它可能会带来以下优势

  • 控制器中的依赖更少
  • 易于测试的表单处理
  • 从控制器中提取业务逻辑
  • 更多可重用代码

它还处于早期阶段,可能会发生变化,但接口不太可能变化。建议您关注版本,而不是分支(如~0.1)。

安装

在您的 composer.json 中添加它

{
    "require" : {
        "mitom/form-handler-bundle" : "~0.1"
    }
}

然后在您的 AppKernel.php 中添加组件

    $bundles = [
        // ...
        new Mitom\Bundle\FormHandlerBundle\FormHandlerBundle()
    ];

用法

首先,您需要一个 FormType 来与之一起工作,您可以根据 官方 symfony 文档 创建一个。例如

namespace Acme\TaskBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class TaskType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('task')
            ->add('dueDate', null, ['widget' => 'single_text'])
            ->add('save', 'submit');
    }

    public function getName()
    {
        return 'task';
    }
}

接下来,您需要为它创建一个 FormHandler。该组件提供了一个 AbstractFormHandler 来简化您的操作,但当然您不必使用它。《FormHandler》只需实现《FormHandlerInterface》。

namespace Acme\TaskBundle\Form\Handler;

use Mitom\Bundle\FormHandlerBundle\Handler\AbstractFormHandler;
use Acme\Entity\Task;
use Acme\Entity\Form\Type\TaskType;
use Symfony\Component\Routing\RouterInterface;

class TaskFormHandler extends AbstractFormHandler
{
    private $router;

    public function __construct(RouterInterface $router)
    {
      $this->router = $router;
    }

    /** @inheritDoc */
    public function getType()
    {
        /**
         * In case your FormType is a service, you could just return
         * its' alias here as a string and let the FormFactory create it
         * for you.
         */
        return new TaskType();
    }

    public function onSuccess(FormData $formData)
    {
        /**
         * do whatever you want, like persisting to database
         */

        return new RedirectResponse($this->router->generate('acme.task', ['task' => $formData->getData()->getId()]));
    }

    public function onError(FormData $formData)
    {
        /**
         * do whatever you want, like log the error or simply return the FormData.
         */

        return ['form' => $formData->getForm()->createView()];
    }
}

下一步是将 FormHandler 注册为服务,并标记为 mitom.form_handler

acme_task.task.form_handler:
    class: Acme\TaskBundle\Form\Handler\TaskFormHandler
    arguments:
        - "@router"
    tags:
        - { name: "mitom.form_handler" }

在您的控制器中注入 mitom_form_handler.manager 服务

acme_task.task.controller:
    class: Acme\TaskBundle\Controller\TaskController
    arguments:
        - "@mitom_form_handler.manager"

或者,您可以直接注入一个 FormHandler,如果您的控制器只需要一个处理器。然而,我仍然建议通过 Manager 进行操作,因为它使得以后使用其他处理器变得容易,并保持事物的一致性。

最后,利用它

namespace Acme\TaskBundle\Controller;

use Mitom\Bundle\FormHandlerBundle\FormData;
use Mitom\Bundle\FormHandlerBundle\FormHandlerManager;
use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

class TaskController
{
    protected $formHandlerManager;

    /**
     * @param FormHandlerManager $formHandlerManager
     */
    public function __construct(FormHandlerManager $formHandlerManager)
    {
        $this->formHandlerManager = $formHandlerManager;
    }


    /**
     * @Template()
     */
    public function newAction()
    {
        return ['form' => $this->formHandlerManager()->getHandler('task')->createForm()->createView()];
    }


    /**
     * @Template()
     */
    public function createAction(Request $request)
    {
        $formData = new FormData();
        $formData->setRequest($request);

        // note that you can get the handler by using the name of the FormType
        return $this->formHandlerManager()->getHandler('task')->handle($formData);
    }
}

上面的示例使用了 Template 注解来使其更简洁,但这并不是本组件的依赖项。