使用数据转换器

时间:2015-05-14 10:41:31

标签: php symfony symfony-forms

我正在开发一个项目,使用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并为其设置了模型转换器:

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';
    }
} 

如果我通过调用setData方法创建TextType并设置数据,那么一切正常:

$form = $this->createForm(new TextType());
$form->setData(new SimpleFormData("test"));

如果我尝试传递默认数据,我会收到错误:

$form = $this->createForm(new TextType(), new SimpleFormData("test"));

抛出的错误说:

  

表单的视图数据应该是类的实例   MyApp \ FormBundle \ Model \ SimpleFormData,但是是一个(n)字符串。您可以   通过将“data_class”选项设置为null或by来避免此错误   添加一个视图转换器,将(n)字符串转换为实例   MyApp \ FormBundle \ Model \ SimpleFormData。

我当然不希望viewData属于SimpleFormData类型(因此是变换器)。另外,我还没有设置data_class,Symfony的Form类从传递的数据对象中选择数据类。

我有两个问题:

  1. 如何才能传递默认数据?
  2. 为什么Symfony希望viewData的类型为data_class?我的理解是modelData应该是data_class类型而不是viewData。

0 个答案:

没有答案