W encji mamy pole legal1 typu boolean, które nie może być NULL-em.
/** * @var boolean * * @ORM\Column(name="legal1", type="boolean", columnDefinition="TINYINT(1)") */ private $legal1;
W formularzu pole jest prezentowane jako checkbox. Niby wszystko powinno działać, a jednak jeśli wyślemy formularz bez zaznaczania checkboxa to na encji nie jest wywoływana metoda setLegal1()
, a w rezultacie Doctrine próbuje zapisać NULL jako wartość pola legal1, co oczywiście kończy się wyjątkiem.
Można kombinować na samej encji (np. zwracać z getLegal1()
0 jeśli wartość to NULL), ale chyba najbardziej eleganckim rozwiązaniem będzie zastosowanie transformera, który będzie tłumaczył wartości pomiędzy encją a formularzem. Prościutki transformer realizujący takie zadanie może wyglądać tak.
namespace MDurys\CommonBundle\Lib\DataTransformer; use Symfony\Component\Form\DataTransformerInterface; class BoolTransformer implements DataTransformerInterface { public function transform($input) { return boolval($input); } public function reverseTransform($input) { return intval($input); } }
W formularzu należy go zastosować jako model transfomer:
$builder ->add( $builder->create('legal1', 'checkbox')->addModelTransformer(new BoolTransformer()) )
Jego działanie polega na tym, że podczas tworzenia formularza zostanie wywołana metoda transform()
, która wartość z bazy danych (0 lub 1) rzutuje na wartość boolowską. Z kolei podczas zapisywania formularza zostanie wywołana metoda reverseTransform()
, która rzutuje wartość z formularza na liczbę całkowitą. Tym sposobem z NULL-a zrobi się 0.