【问题标题】:Symfony 5: Expected argument of type "string", "object" given at property path "myEntity"Symfony 5:在属性路径“myEntity”中给出的“string”、“object”类型的预期参数
【发布时间】:2020-12-14 06:21:03
【问题描述】:

我在 Symfony 5 中遇到了 EntityType 类的问题,我找不到让表单行返回 string 而不是实体 (MyEntity) 的方法。作为表单构建器的一部分,这基本上是我所拥有的:

$builder->add('myEntity', EntityType::class, [
                'class' => MyEntity::class,
                'placeholder' => "(Please select an option.)",
                'choice_label' => 'name'
            ])

我的目标是让该字段返回 name 以选择 MyEntity,而不是整个实体(因此,与 'choice_label' 完全相同的值)。我已经尝试添加'choice_value' => 'name' 属性(带有'mapped' => false 属性,这在这种情况下显然是必要的),但无济于事。更准确地说,表单行开始返回null,而不是任何实体的string

我将如何实现我的目标?

【问题讨论】:

  • 您将其配置为期待一个实体 - 为什么您会期待其他任何东西?我相信data transformers 可能就是您想要的。
  • 谢谢,事实证明在MyEntity 中为name 字段定义__toString() 函数(与为name 字段定义getter 方法完全相同)已修复它,我现在没有错误,并且成功提交到数据库。结案!

标签: php forms symfony


【解决方案1】:

事实证明,将MyEntity 中的__toString() function 定义为返回name 字段(与定义getName() 完全相同的方式)修复了它,我现在没有收到任何错误,并且成功提交到数据库。

public function __toString() {
    return $this->name;
}

(如果您想知道为什么只有这个添加而没有其他方法可以修复它,那是因为__toString 已经在一些预先存在的实体相关代码中默认使用,以更简单和自定义的方式表达实体,如果我没记错的话。既然我使这个函数可用,它会去它并安全地假设当我的实体可能需要以更简单的 [string] 格式表示时,__toString 应该被称为“将“MyEntity 转换为有意义的字符串,例如它的 name。我想这就是说,例如,您不会通过其所有内部部件来引用汽车,而只是通过其模型来引用汽车。 )

【讨论】:

    【解决方案2】:

    很高兴您找到了正确的解决方案,但它对我不起作用。 我在自己的类型中使用实体类型,该类型在 CollectionType 中调用(是的,有些特殊)。 为了解决我的问题,我使用了DataTransformer,如下:

    class ProductTextTransformer implements DataTransformerInterface
    {
    
      public function reverseTransform($text)
      {
          if (null === $text) {
              return '';
          }
    
          return $text->getName();
      }
    
      public function transform($name)
      {
          // NOTE: Should not Called!
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多