2017-05-14 3 views
2

今日は非常に勤勉であり、私のsymfonyエンティティメソッドのすべてを返す型のヒントを決定しました。だから、:Symfony:EntityメソッドのReturn型ヒントを使用したフォームの問題

<?php 

Class User { 
    private string $username; 
    public method getUsername(): string {} 
} 

すべての良いと私は、新しいユーザーを作成するためのフォームを作ったまでも、:

$user = new User(); 
$this->createForm(SignupType::class, $user); 

をフォームが表示されたとき、symfonyは自動的にUser $userのこの新しいインスタンスのプロパティを取得します。しかし、それは新しいインスタンス化であるため、そのusernameプロパティはもちろんnullです。戻り値の型はstringである必要があります。

Iのいずれかの必要があります。

  1. はsymfonyのエンティティ(MEH)でノーリターン型ヒンティングを持っていません。
  2. セット$username = ''(ただし、空白を許可しないという目的を捨てて、あらゆる種類のエラーが発生することがわかります)。あなたは何のNULL可能戻り値の型宣言をサポートしていませんPHP 7.0を使用している場合やsymfonyのフォーム上のフィールド
  3. 他の可能な解決策アンマップ
  4. は...
+0

可能性のあるD [PHP 7のヒント付きの型にnullを渡そうとするSymfony3フォームコンポーネントの宝庫](http://stackoverflow.com/questions/37577395/symfony3-form-component-trying-to-pass-null-to-a- type-hinted-method-in-php-7) – Vamsi

答えて

6

エンティティプロパティnullになることはありませんすることはできません(、あなたがPHP 7.1以降を使用する)場合は、nullable return type declarationを適用するエンティティとフォームの間の結合の直接データを維持するために、より汚いと高速回避策のように聞こえる(Symfonyフォームコンポーネントを使用して)。 (私の意見で

より良い地球のアプローチは、DTOを使用して、エンティティ(データの送迎オブジェクト)、それは簡単なPOPOある(平野古いPHPオブジェクト)からバインディングフォームデータを分離することですフォームデータが含まれています。 DTOを使用して

は、(データの一貫性損失)あなたのエンティティで、厳格なタイプヒンティングを維持することができないだろうし、あなたのエンティティから(だけでなく、データ検証)に結合するフォームデータを分離します。

DTO'sは再利用可能で、他にも多くの利点があります。

symfonyのフォームでのDTOの使用に関するいくつかの有用な参考文献:

+0

ありがとうございました。それは私により良い指導を与えるので、これはより良い答えです。 Mikhailはもちろんphp7.1でも動作しますが、確かにちょっとハッキーです – bluppfisk

2

、最初のオプションは右になります(非ハッキー)選択。 PHP 7.1+を使用している場合は、nullable return type declarationを定義することができます。

<?php 

class User 
{ 
    public function getUsername(): ?string {} 
} 
関連する問題