2017-02-24 5 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은 몇 가지 양식 유형에서 사용되며 항상 연도, 월, 일이 아니기 때문에 인수로 사용합니다.

TimeType, DateTypeDateTimeType에서 사용됩니다. 모두 배열과 역순으로 \DateTime 개체로 변형되어야하지만, 각각은 전체 datetime의 다른 부분을 가지고 있습니다. TimeType, DateTypeDateTimeType 클래스로

봐는 $fields 인수가 어떻게 구성되는지 확인합니다.

DateTimeToArrayTransformer은 개체를 적절하게 만들거나 개체를 적절한 값 배열로 구문 분석 할 수 있도록이 정보가 필요합니다. 그것은 을 의미하는 필요와 날짜 부품의 전체 배열의 교집합을 수행 transform에서

(배열 \DateTime)는 "내가 원하는 것을, 내 유일한 이러한 부품을 제공". 당신이 원하는 인수를 취할 수 있습니다 일반적으로 DataTransformer 클래스에서

///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) 
     )); 
    } 

: 전달 된 배열이 필요한 모든 부품이 포함 된 경우

reverseTransform $fields, 그것은 사용 (배열 \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)); 

검증하는 일반적으로 FormType 안에있는 인스턴스를 만드는 위치에서 전달할 수있는 한.

+0

https : // github을 참조하십시오.('year', 'month', 'day')'는 실제 폼 필드 이름을 포함하고 있습니다. (예 : 위의 줄에서 빌더에 사용 된 필드 이름) 또는 다른 것입니까? 빌더에서 사용 된 이름을 참조합니까? – user2190492

+0

음, 그렇습니다. 접두사가없는 양식 필드 이름입니다. 실제 html 인''에는 아마 어떤 형태의 접두어가 들어있을 것입니다. 그러나이 양식 유형과이 변환 도구가 함께 작동하도록 설계된 것입니다. 일반적으로 규칙이 아닙니다. –