2017-02-24 3 views
1

この質問はSymfony PHPフレームワークに関するものです。SymfonyのDateTimeToArrayTransformerはフォームフィールドの名前を使用して1つの値を作成しますか?

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つの文字列値にする必要があります。しかし、これはデータトランスフォーマーや別の方法で行いますか?

これは私が知りたいことです。

答えて

1

DateTimeToArrayTransformerは、いくつかのフォームタイプで使用され、常に年、月、日ではないため、引数として$fieldsを受け取ります。

TimeType,DateTypeおよびDateTimeTypeで利用されています。それらのすべてを配列と逆のオブジェクトに変換する必要がありますが、それぞれは完全な日時の異なる部分を持っています。

TimeType,DateTypeおよびDateTimeTypeクラスを参照すると、どのように$fields引数が構成されているかを確認できます。

DateTimeToArrayTransformerは、適切な値の配列にオブジェクトを解析して、適切な\DateTimeオブジェクトを構築できるようにするためにこの情報を必要とします。それはを意味し、必要と日時部品の完全な配列の交点を行いtransform

(配列へ\DateTimeは「私がしたいことを、私の唯一のこれらの部品を与えます」。 reverseTransformにおける一方(\DateTimeに配列)で、それが渡される配列は、必要なすべての部品が含まれているかどうかを検証するために$fieldsを使用しています

$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)); 

:一般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) 
     )); 
    } 

は、あなたが望む任意の引数を取ることができ、ただし、通常はFormTypeの内部にインスタンスを作成する場所で渡すことができます。

+0

https:// githubを参照してください。( '年'、 '月'、 '日') 'は、実際のフォームフィールド名を含んでいます(例えば、 '/'、 '/'、 '上記のビルダーで使用されているフィールド名)、またはそれ以外のものはありますか?ビルダーで使用されている名前を参照していますか? – user2190492

+0

これは正式なフォームフィールド名です。実際のhtmlの ''にはおそらく何らかの形式の接頭辞が含まれています。しかし、このフォームタイプとこのトランスフォーマーが一緒に働くように設計されているのは単なる例です。それは一般的なルールではありません。 –

関連する問題