braunstetter / valid-form-event
当根表单提交且验证有效时触发事件。因此,子表单可以在之后进行响应和操作。
v0.1.0
2022-05-08 19:55 UTC
Requires
- php: ^8.0
- symfony/form: ^6
- symfony/framework-bundle: ^4.4|^5.0|^6.0
Requires (Dev)
README
Symfony 文档建议将逻辑从表单中移除,并在控制器内部执行所有操作。这可能是大多数情况下很好的建议,但例外证明规则。
因为当你有灵活的表单时,例如具有灵活分区的页面构建器,如果各个分区在整个表单验证有效后能够执行某些操作,这将非常有帮助。(例如上传图片)
这个包正好提供了这个功能。
安装
composer require braunstetter/valid-form-event
用法
<?php namespace App\Form\Paragraph; use Braunstetter\MediaBundle\Manager\FilesystemManager; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\Extension\Core\Type\FileType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Validator\Constraints\Image; use Braunstetter\ValidFormEvent\Form\Event\ValidFormEvent; use App\Entity\MyCustomPageBlock; class MyPageBlockType extends AbstractType { private FilesystemManager $filesystemManager; public function __construct(FilesystemManager $filesystemManager) { $this->filesystemManager = $filesystemManager->setFolder('/uploads/images/page_blocks'); } public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add('image', FileType::class, [ 'constraints' => [ new Image(['maxSize' => '5M']) ] ]) ->add('description') // Here is the important part. // Inside the 'valid' event you can do whatever you want to. ->addEventListener(ValidFormEvent::NAME, function (ValidFormEvent $event) { $form = $event->getCurrentForm() ?? $event->getForm(); if ($image = $form->get('image')->getData()) { $this->filesystemManager->upload($image); } }); } public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults([ 'data_class' => MyCustomPageBlock::class, ]); } }
这相当直观。
所有操作都与其他 Symfony FormEvents 相同。还应注意的是,$event->getCurrentForm()
方法也是可用的。这提供了你当前所在的表单 - 但仅当该表单是父表单的子表单时。可以通过 $event->getForm()
轻易地访问父表单。
此事件适用于所有表单,即使它们是嵌套的。