mitom / form-handler-bundle
symfony 的表单处理器组件。
0.2
2014-11-20 11:18 UTC
Requires
- php: >=5.4
- symfony/form: ~2.3
- symfony/http-foundation: ~2.3
Requires (Dev)
- phpunit/phpunit: 4.*
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
注解来使其更简洁,但这并不是本组件的依赖项。