2017-02-24 43 views
1

这个问题是关于Symfony PHP框架的。Symfony DateTimeToArrayTransformer是否使用表单字段的名称来创建一个值?

我想更好地理解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) 
{ 
//... 

DateTimeToArrayTransformer on github

我无法找到有关fields参数在互联网上的任何信息。但我得到的印象是这意味着现有表单字段的字段名称。

当然,Symfony必须收集month,dayyear字段的表单字段值,以便创建一个字符串值。但是,它是通过数据转换器还是以其他方式执行此操作?

这就是我想知道的。

回答

1

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

它用于TimeType,DateTypeDateTimeType。他们都需要被转换为\DateTime对象来进行数组和反转,但是它们中的每一个都具有完全日期时间的不同部分。

看看TimeType,DateTypeDateTimeType类,看看如何构造$fields参数。

DateTimeToArrayTransformer需要此信息才能够构建合适的对象或反之亦然,请将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之内。

+0

请参阅https:// github。com/symfony/form/blob/master/Extension/Core/Type/DateType.php#L120在那一行,'array('year','month','day')'包含实际的表单字段名称在上面的行中用于构建器中的字段名称),还是其他的东西?它是否涉及构建器中使用的名称? – user2190492

+0

嗯,是的,他们是没有前缀的表单字段名称。实际的html''可能会包含一些表单前缀。但这只是这种形式的类型,而这种变形器是为了一起工作而设计的。这通常不是一个规则。 –

相关问题