我正在开发一个项目,使用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类从传递的数据对象中选择数据类。
我有两个问题: