EasyAdminBundle:验证不适用于 CKEditorType

EasyAdminBundle: Validation not working on CKEditorType

在我使用 EasyAdminBundle, my form validations only work with fields that do not have the CKEditorType. Some fields need to be edited so I implemented a WYSIWYG with FOSCKEditorBundle 创建的管理面板中。

来自相关领域的片段:

- { property: 'content', type: 'FOS\CKEditorBundle\Form\Type\CKEditorType'} 

当我提交带有空 'content' 字段的表单时,我得到一个 InvalidArgumentException 错误:Expected argument of type "string", "NULL" given. 而不是像 Please fill 这样的验证错误在这个领域。

没有 CKEditor 的相关领域的代码片段:

- { property: 'content' } 

=> 验证工作完美。

我的实体字段:

    /**
     * @ORM\Column(type="text")
     * @Assert\NotBlank
     * @Assert\NotNull
     */
    private $content;

Symfony 分析器显示该字段确实具有 required 属性。

如何使用 CKEditor 字段类型启用验证?

这与 ckeditor 无关。您只需要通过参数修正您的内容 setter 以接受 NULL。然后应该正确触发验证过程:

public function setContent(?string $content) {
    $this->content = $content;

    retrun $this;
}

在将请求值设置为表单数据(在您的情况下为实体)字段后执行验证。您可以在此处找到表单提交流程:https://symfony.com/doc/current/form/events.html#submitting-a-form-formevents-pre-submit-formevents-submit-and-formevents-post-submit

为了依靠 Symfony 的表单生成器来克服这个问题,我向“CKEditorField”添加了约束“NotBlank”。

在控制器上看起来像这样:

...
use App\Admin\Field\CKEditorField;
use Symfony\Component\Validator\Constraints\NotBlank;
...

public function configureFields(string $pageName): iterable
{    
    return [
        IdField::new('id')->hideOnForm(),
        TextField::new('title')->setFormTypeOption('required',true),
        CKEditorField::new('description')->setFormTypeOption('required',true)
        ->setFormTypeOption('constraints',[
            new NotBlank(),
        ])
    ];
}
...

以及在控制器中使用的 EasyAdmin 字段 class 文件(添加此内容以遵循 EasyAdmin 的方法):

<?php

namespace App\Admin\Field;

use EasyCorp\Bundle\EasyAdminBundle\Contracts\Field\FieldInterface;
use EasyCorp\Bundle\EasyAdminBundle\Field\FieldTrait;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use FOS\CKEditorBundle\Form\Type\CKEditorType;

final class CKEditorField implements FieldInterface
{
    use FieldTrait;

    public static function new(string $propertyName, ?string $label = null):self
    {
        return (new self())

            ->setProperty($propertyName)
            ->setLabel($label)
            ->setFormType(CKEditorType::class)
            ->onlyOnForms()
        ;
    }
}