2016-04-13 17 views
6

Quindi, desidero poter inviare un'opzione null al mio campo DOB.Symfony2 DateTime null accept

Ecco il mio generatore di forma:

->add('birthDate', DateType::class, array(
       'widget' => 'single_text', 
       'format' => 'yyyy-MM-dd')) 

Ed ecco quelli campo nella mia entità

/** 
    * @ORM\Column(
    *  type="date", 
    *  nullable=true 
    *) 
    * @JMS\Groups("single") 
    * 
    * @var \DateTime 
    */ 
    protected $birthDate; 

Quando `m cercando di inviare un nulla ho ricevuto un msg di errore

Expected argument of type "DateTime", "NULL" given 

qualche idea?

CRITICAL - Uncaught PHP Exception Symfony\Component\PropertyAccess\Exception\InvalidArgumentException: "Expected argument of type "DateTime", "NULL" given" at /var/www/server.local/vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php line 253 



    $type = $trace[$i]['args'][0]; 
    $type = is_object($type) ? get_class($type) : gettype($type); 
    throw new InvalidArgumentException(sprintf('Expected argument of type "%s", "%s" given', substr($message, $pos, strpos($message, ',', $pos) - $pos), $type)); 
} 

}

+1

Quando si sta questo errore? – abdiel

+0

Quando si inoltra il modulo con il campo data nascita –

+0

e si è verificato anche che lo schema del DB sia sincronizzato con l'entità? – Vamsi

risposta

14

In questo caso, il problema è stato causato da tipo PHP hinting. Se si utilizza il suggerimento del tipo (ad esempio setBirthDate(\DateTime $value)), PHP impone di fornire effettivamente un oggetto DateTime. Ovviamente, null non è un tale oggetto. Per risolvere questo problema, è possibile assegnare a $value un valore predefinito come questo: setBirthDate(\DateTime $value = null).

Questo comportamento è documentato e spiegato nella Documentazione di PHP (http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration).

passaggio rilevante:

Per specificare una dichiarazione di tipo, il nome del tipo deve essere aggiunto prima del nome del parametro. La dichiarazione può essere fatta per accettare valori NULL se il valore predefinito del parametro è impostato su NULL.

+2

Nota: per PHP 7.1 puoi anche suggerire di suggerirlo come nullable opzionale: 'setBirthDate (? \ DateTime $ value) ' –

2

non passare alcun valore ad esso. Effettuare il campo non richiesto in questo modo:

->add(
    'birthDate', 
    DateType::class, 
    array(
     'required' => false, 
     'widget' => 'single_text', 
     'format' => 'yyyy-MM-dd' 
    ) 
) 
+1

Non funziona per me –

+0

Come si impostano i dati del modulo? -> handleRequest ($ richiesta); ? – LMS94

+0

No. Come vedi, sto usando le annotazioni ORM, ecco perché la tua soluzione non funziona per me, è così che penso che le annotazioni ORM –

0

Ho utilizzato il campo DOB ​​nel mio progetto. Prova questo. Il mio file ORM assomiglia a questo <field name="dob" type="date" column="dob" nullable="true"/>

->add('dob','birthday',array(
      'widget' => 'single_text', 
      'format' => 'dd-MM-yyyy', 
      'required' => false, 
      'attr' => array('class' => 'datepicker', 
       'data-provide' => 'datepicker','data-date-format' => 'dd-mm-yyyy') 
     )) 
+0

Non è così semplice per me. Ho creato una direttiva angolare, che consiste di 3 input a discesa per giorno, data e anno –

2

Il problema si verifica a causa di setter accennato come indicato nei commenti. Ci sono due soluzioni:

1. Uso 'by_reference' => true sul modulo:

$builder->add(
    'birthDate', 
    DateType::class, 
    [ 
     'widget' => 'single_text', 
     'format' => 'yyyy-MM-dd', 
     'by_reference' => true, 
    ] 
); 

2. Let null a voi setter come un valore predefinito:

public function setBirthDate(\DateTime $value = null) 
{ 
    ..... 
} 
+0

La tua prima soluzione ha più senso. Anche la seconda funziona, ma questo renderà il campo in attesa di dati indesiderati (null) –