2017-05-14 1 views
2

J'étais extrêmement diligent aujourd'hui et j'ai décidé de retourner le type de toutes mes méthodes d'entité symfony. Alors:Symfony: Problème de formulaire utilisant l'indicateur de type de retour dans les méthodes d'entité

<?php 

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

tout bon et bien, jusqu'à ce que je fait un formulaire pour créer un nouvel utilisateur:

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

lorsque le formulaire est affiché, Symfony obtient automatiquement les propriétés de cette nouvelle instance de User $user. Mais puisqu'il s'agit d'une nouvelle instanciation, sa propriété username est bien sûr toujours null, ce qui est un type de retour incorrect car il doit être string.

Si je soit:

  1. ont pas hinting type de retour dans les entités Symfony (meh);
  2. mis $username = '' (mais le chapeau sorte du but de ne pas permettre des blancs et je peux voir toutes sortes d'erreurs évoluant); ou
  3. unmap le champ sur le formulaire de symfony
  4. autres solutions possibles ...
+0

possible d exprès de [Composant de Formulaire Symfony3 essayant de passer null à une méthode de type tapée en PHP 7] (http://stackoverflow.com/questions/37577395/symfony3-form-component-trying-to-pass-null-to-a- type-hinted-method-in-php-7) – Vamsi

Répondre

6

Si une propriété entité ne peut jamais être null (et que vous utilisez PHP 7.1+), puis en appliquant la nullable return type declaration ressemble plus à une solution sale et rapide pour maintenir des données liaison directe entre les entités et les formes (en utilisant le composant de formulaire Symfony).

Une meilleure approche globale (à mon avis) est de découpler les données du formulaire de liaison de vos entités à l'aide d'un DTO (données Transfert objet), qui est un simple POPO (Plain Old PHP Object) à contenir vos données de formulaire.

L'utilisation d'un DTO vous permettra de maintenir un type hinting stricte dans vos entités (sans perte de cohérence des données) et dissociera les données de formulaire de liaison (mais aussi la validation des données) de vos entités. DTO permet la réutilisabilité et présente de nombreux autres avantages.

Quelques références utiles sur l'utilisation de ce DTO avec symfony Forms:

+0

merci; C'est la meilleure réponse car cela me donne de meilleurs conseils. Mikhail fonctionne bien sûr aussi dans php7.1 mais est en effet un peu hacky – bluppfisk

2

Si vous utilisez PHP 7.0, qui n'a pas de support de déclaration de type de retour annulable, la première option sera la bonne choix (non-hacky). Si vous utilisez PHP 7.1+, vous pouvez définir un nullable return type declaration.

<?php 

class User 
{ 
    public function getUsername(): ?string {} 
}