Symfony DateTimeToArrayTransformer是否使用表单字段的名称来创建一个值?

时间:2017-02-24 15:41:04

标签: php forms symfony mapping field

这个问题是关于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必须收集monthdayyear字段的表单字段值,以生成一个字符串值。但它是用数据变换器或其他方式做到的吗?

这就是我想知道的。

1 个答案:

答案 0 :(得分:1)

DateTimeToArrayTransformer$fields作为参数,因为它在几种表单类型中使用,并不总是年,月和日。

TimeTypeDateTypeDateTimeType中使用了它。所有这些都需要转换为\DateTime对象到数组和反向,但每个都有完整日期时间的不同部分。

查看TimeTypeDateTypeDateTimeType类,了解如何构造$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>