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()
;
}
}
在我使用 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()
;
}
}