这个问题是关于Symfony PHP框架的。
我想更好地理解Symfony如何将复合形式类型的值映射到单个值。
当您使用DateType
表单类型,并将其配置为使用月,日和年的单独字段时,它会创建单独的表单字段,这些字段具有自己的字段名称。
DateType
也有数据转换器。通常,数据转换器只是将数据从一种格式转换为另一种格式。但对我来说,似乎DateTimeToArrayTransformer
也在其构造函数中获取表单字段名称。
请参阅此处的构造函数:
/**
* Constructor.
*
* @param string $inputTimezone The input timezone
* @param string $outputTimezone The output timezone
* @param array $fields The date fields <--- See this parameter.
* @param bool $pad Whether to use padding
*
* @throws UnexpectedTypeException if a timezone is not a string
*/
public function __construct($inputTimezone = null, $outputTimezone = null, array $fields = null, $pad = false)
{
//...
http://www.cept.org/files/1050/documents/winner2%20-%20final%20report.pdf
我无法在互联网上找到有关fields
参数的更多信息。但我得到的印象是它意味着现有表单字段的字段名称。
当然,Symfony必须收集month
,day
和year
字段的表单字段值,以生成一个字符串值。但它是用数据变换器或其他方式做到的吗?
这就是我想知道的。
答案 0 :(得分:1)
DateTimeToArrayTransformer
将$fields
作为参数,因为它在几种表单类型中使用,并不总是年,月和日。
在TimeType
,DateType
和DateTimeType
中使用了它。所有这些都需要转换为\DateTime
对象到数组和反向,但每个都有完整日期时间的不同部分。
查看TimeType
,DateType
和DateTimeType
类,了解如何构造$fields
参数。
DateTimeToArrayTransformer
需要此信息才能构建合适的\DateTime
对象,反之亦然,将DateTime
对象解析为适当的值数组。
在transform
(\DateTime
到数组)中,它会将完整的日期时间部分与所需部分相交,这意味着“只给我这些部分,我想要的”
$result = array_intersect_key(array(
'year' => $dateTime->format('Y'),
'month' => $dateTime->format('m'),
'day' => $dateTime->format('d'),
'hour' => $dateTime->format('H'),
'minute' => $dateTime->format('i'),
'second' => $dateTime->format('s'),
), array_flip($this->fields));
另一方面,在reverseTransform
(数组到\DateTime
)中,它使用$fields
来验证传递的数组是否包含所有必需的部分:
///if any of required field does not exists, add to `$emptyFields`
foreach ($this->fields as $field) {
if (!isset($value[$field])) {
$emptyFields[] = $field;
}
}
//if there is some field missing, throw an Exception
if (count($emptyFields) > 0) {
throw new TransformationFailedException(
sprintf('The fields "%s" should not be empty', implode('", "', $emptyFields)
));
}
通常DataTransformer
类可以接受你想要的任何参数,只要你可以在你创建它的实例的地方传递它们,通常在FormType
内。 / p>