Php 使用数据转换器在Symfony文本字段上设置默认数据

Php 使用数据转换器在Symfony文本字段上设置默认数据,php,symfony,symfony-forms,Php,Symfony,Symfony Forms,我正在进行一个项目,使用yaml文件或任何其他可能以关联数组形式返回表单描述的数据源动态创建Symfony表单。为了更好地处理问题,我希望包装Symfony的核心类型,以便使用数据对象而不是标量数据。数据对象将是一个带有getter setter的简单包装器 class SimpleFormData implements FormData { /** * @var mixed data */ private $data; /** * @p

我正在进行一个项目,使用yaml文件或任何其他可能以关联数组形式返回表单描述的数据源动态创建Symfony表单。为了更好地处理问题,我希望包装Symfony的核心类型,以便使用数据对象而不是标量数据。数据对象将是一个带有getter setter的简单包装器

class SimpleFormData implements FormData {

    /**
     * @var mixed data
     */
    private $data;

    /**
     * @param $data
     */
    function __construct($data) {
        $this->data = $data;
    }


    /**
     * @return mixed
     */
    public function getData() {
        return $this->data;
    }

    /**
     * @param mixed $data
     */
    public function setData($data) {
        $this->data = $data;
    }
} 
我从编写数据转换器开始:

class SimpleFormDataTransformer implements DataTransformerInterface {
    /**
     * @param mixed $value The value in the original representation
     * @return mixed The value in the transformed representation
     * @throws TransformationFailedException When the transformation fails.
     */
    public function transform($value) {
        if(is_null($value)) {
            return '';
        }

        if($value instanceof FormData) {
            return $value->getData();
        }

        $actualType = is_object($value) ? 'an instance of class '.get_class($value) : ' a(n) '.gettype($value);

        $message = sprintf("Expected argument of type MyApp\\FormBundle\\FormData\\FormData, got %s", $actualType);
        throw new TransformationFailedException($message);
    }

    /**
     * @param mixed $value The value in the transformed representation
     * @return mixed The value in the original representation
     * @throws TransformationFailedException When the transformation fails.
     */
    public function reverseTransform($value) {
        return new SimpleFormData($value);
    }
} 
我创建了一个自定义TextType并将model transformer设置为:

class TextType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $transformer = new SimpleFormDataTransformer();
        $builder->addModelTransformer($transformer);
    }

    /**
     * Returns the name of this type.
     *
     * @return string The name of this type
     */
    public function getName() {
        return 'form_bundle_type_core_text';
    }

    public function getParent() {
        return 'text';
    }
} 
如果我创建一个TextType并通过调用setData方法设置数据,一切都会正常工作:

$form = $this->createForm(new TextType());
$form->setData(new SimpleFormData("test"));
如果尝试传递默认数据,则会出现错误:

$form = $this->createForm(new TextType(), new SimpleFormData("test"));
抛出的错误表示:

表单的视图数据应该是类的实例 MyApp\FormBundle\Model\SimpleFormData,但为字符串。你可以 通过将data_class选项设置为null或 添加将字符串转换为实例的视图转换器 MyApp\FormBundle\Model\SimpleFormData的

我当然不希望viewData是SimpleFormData类型,因此使用transformer。另外,我还没有设置data_类,Symfony的表单类从传递的数据对象中选择数据类

我有两个问题:

我应该怎么做才能传递默认数据? 为什么Symfony希望viewData为data\u类类型?我的理解是modelData应该是data_类的类型,而不是viewData。
您可以使用预先设置的表单事件监听器而不是模型转换器来处理您的用例。然后,您可以通过一个选项传递配置“标识符”的名称?@DebreczeniAndrás我认为这对我的用例没有帮助。同意,我可能可以接受SimpleFormData对象,然后在事件中使用SimpleFormData对象上的getData更新值。但是,字段上的ModelData仍然是标量的,也就是说,如果在字段上执行getData,它将返回标量字符串值,而不是SimpleFormData对象。如果我错了,请纠正我。