我需要帮助检查我的想法是否正确。
我的应用程序允许在网站上发布广告。我有很多类似领域的实体。例如,考虑这种方法:
我有 3 个实体:
我有两个特征(以避免多次声明相同的实体属性): BaseTrait:名称、描述 地址特征:地址 1、地址 2、城市
我有 2 个自定义表单字段:
我的目标是使用字段
address
和 baseInfo
将其组合在一个字段中,并将实体的约束附加到字段(包含在这些自定义字段中),例如:
class Advertisement {
// My entity
#[Assert\NotBlank]
private string $name;
#[Assert\NotBlank]
private string $description;
#[Assert\NotBlank]
private string $address1;
#[Assert\NotBlank]
private string $address2;
#[Assert\NotBlank]
private string $city;
//Form
$builder->add('baseInfo', BaseType::class, [ // Map properties from this field to Advertisement properties: name, description
$builder->add('address', AddressType::class, [ // Map properties from this field to Customer properties: address1, address2, city
因此,提交表单后,当字段为空时,我应该会出现错误
name, description, address1, address2, city
(因为实体定义了约束NotBlank)。
我想对其他实体执行相同的操作(重用我的一些自定义字段),例如:
class Customer {
// My entity
#[Assert\NotBlank]
private string $name;
#[Assert\NotBlank]
private string $description;
#[Assert\NotBlank]
private string $anotherProperty;
//Form
$builder->add('baseInfo', BaseType::class, [ // Map properties from this field to Customer properties: name, description
$builder->add('anotherProperty', TextType::class
类似,字段
name, description
应该受到实体的约束
我从 ChatGPT 或 Symfony 文档中尝试了很多东西,但没有运气。当我尝试添加自定义字段时,我无法设置
mapping=>true
,因为实体内部不存在属性地址/baseInfo(其逻辑)。当我输入 mapping=>false
时,就会跳过验证。
我尝试合并验证组,但运气也不太好。似乎 Symfony 文档没有说明如何使用自定义字段(带约束)将实体字段嵌套到自定义表单类型中。
我没有在这里分享我的代码,因为我想知道我的想法是否正确。也许我可以通过父抽象类来解决它,或者根据接口等制作完整的形式。但这意味着,对于(例如 50 个实体),我将不得不创建 50 个相似或独特的形式,这对我来说是不必要的努力。
总而言之,将感谢您提供如何正确解决此问题的想法 并且不要重复太多代码。
将感谢您的所有提示。
您尝试做的事情在 Symfony 表单中非常常见,幸运的是,有关于此主题的文档。有一个名为“inherit_data”的表单选项,可让您减少重复代码。
在 Symfony 网站上了解更多信息:https://symfony.com/doc/current/form/inherit_data_option.html