Symfony 7 - 与许多实体重用通用表单部分的正确方法

问题描述 投票:0回答:1

我需要帮助检查我的想法是否正确。

我的应用程序允许在网站上发布广告。我有很多类似领域的实体。例如,考虑这种方法:

我有 3 个实体:

  • 客户(包含:ID、姓名、描述)
  • 广告(包含:id、名称、描述、地址1、地址2、城市)
  • 送货地址:(包含:id、地址1、地址2、城市)

我有两个特征(以避免多次声明相同的实体属性): BaseTrait:名称、描述 地址特征:地址 1、地址 2、城市

我有 2 个自定义表单字段:

  • 地址(包含:地址1、地址2、城市)
  • baseInfo(包含:名称、描述)

我的目标是使用字段

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 个相似或独特的形式,这对我来说是不必要的努力。

总而言之,将感谢您提供如何正确解决此问题的想法 并且不要重复太多代码。

将感谢您的所有提示。

php symfony symfony7
1个回答
0
投票

您尝试做的事情在 Symfony 表单中非常常见,幸运的是,有关于此主题的文档。有一个名为“inherit_data”的表单选项,可让您减少重复代码。

在 Symfony 网站上了解更多信息:https://symfony.com/doc/current/form/inherit_data_option.html

© www.soinside.com 2019 - 2024. All rights reserved.