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.