В прошлом у меня была похожая проблема при использовании $ this-> внутри формы.
Иногда $ this не содержит текущих данных. Это может объяснить, почему он загружается сначала, но при отправке может не заполняться должным образом.
Я бы предложил создать пользовательский тип формы для лучшего повторного использования, и я знаю, что он работает очень хорошо.
Поскольку у вас уже есть свой класс DataTransformer, вам нужно будет создать новый пользовательский тип Type. Этот новый тип формы расширит TextType и будет использовать преобразователь данных.
Например:
namespace App\Form\Branch\Type;
use App\Form\Branch\DataTransformer\PhoneFormatTransformer;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class PhoneType extends AbstractType
{
private $tools;
public function __construct()
{
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$transformer = new PhoneFormatTransformer();
$builder->addModelTransformer($transformer);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array());
}
public function getParent()
{
return TextType::class;
}
public function getBlockPrefix()
{
return 'phone';
}
}
Если ваши службы не подключены автоматически, вам нужно добавить определение службы с указанным тегом c
App\Form\Branch\Type\PhoneType:
tags:
- { name: form.type, alias: phone }
Все, что осталось сделать, - это использовать новый тип формы в конструкторе форм:
use App\Form\Branch\Type\PhoneType;
...
$builder
->add('phone', PhoneType::class);
Это немного сложнее, но его очень легко использовать повторно, что, без сомнения, вам придется делать каждый раз, когда необходимо поле даты и времени.
Надеюсь, это поможет!