我发现可以使用FormType
选项访问property_path
中实体的数据。只要PropertyAccessor找到相应的值,下面的示例就可以正常工作。
class Tag
{
use Knp\Translatable;
// other properties
}
class TagTranslation
{
use Knp\Translation;
/** @ORM\Column(type="string") */
private $name;
}
class TagType extends AbstractType
{
// ...
private function getAdminLocale(): string
{
return $this->session->get('admin_locale');
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
// add other properties
$builder->add('translations', TagTranslationType::class, [
'property_path' => 'translations['.$this->getAdminLocale().']',
'constraints' => new Valid(),
]);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(['data_class' => Tag::class]);
}
}
如果PropertyAccessor在给定的property_path
上找不到任何内容,则似乎Symfony表单组件将创建一个新的空TagTranslation
。是否存在一种优雅的方式来传递用于构造该对象的数据或以其他任何方式对其进行水化处理?我尝试使用empty_data
进行实验,但没有成功。
为了使Knp转换正常工作,TagTranslation
对象至少需要->setLocale()
和->setTranslatable()
的值。