braunstetter/valid-form-event

当根表单提交且验证有效时触发事件。因此,子表单可以在之后进行响应和操作。

安装: 206

依赖: 0

建议者: 0

安全性: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:symfony-bundle

v0.1.0 2022-05-08 19:55 UTC

This package is auto-updated.

Last update: 2024-09-09 01:22:57 UTC


README

Scrutinizer Code Quality Code Coverage Build Status Total Downloads License

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() 轻易地访问父表单。

此事件适用于所有表单,即使它们是嵌套的。