我想将我的班级与表格联系起来。我是否有可能为表格提供不同于课堂上的名字?例如,类具有属性用户名,但我希望在表单中映射到id login
的输入use Symfony\Component\Form\FormBuilderInterface;
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('login', 'text', array (
'label' => 'Login'
)) //<- different name mapped by login
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\User',
));
}
User
实体:
class User {
protected username;
//...
}
答案 0 :(得分:4)
是。您正在寻找property_path
。见http://symfony.com/doc/2.8/reference/forms/types/form.html#property-path
$builder->add('login', 'text', array(
'label' => 'Login',
'property_path' => 'username',
));
答案 1 :(得分:0)
是的,你可以。将'mapped' => false
选项添加到您希望名称与实体名称不同的字段中。这告诉symfony,当提交表单时,它不会尝试将该字段映射到实体。但是在这里,您需要做额外的工作 - 1.将实体用户名属性中的数据添加到未映射的数据,以及2.提交表单时,将手动提交的登录数据映射到用户名属性。这些步骤可以通过Form Events完成,如下所示:
use Symfony\Component\Form\FormBuilderInterface;
public function buildForm(FormBuilderInterface $builder, array $options)
{
// Set other fields...
$builder->addEventListener(FormEvents::PRE_SET_DATA, [$this, 'onPreSetData']);
}
function onPreSetData(FormEvent $event)
{
$form = $event->getForm(); // The form
$data = $event->getData(); // It will be User entity
$form
->add('login', 'text', array (
'label' => 'Login',
'mapped' => false,
'data' => $data->getUsername(),
));
}
function onPostSubmit(FormEvent $event)
{
$data = $event->getData();
$form = $event->getForm();
$data->setUsername($form->get('login')->getData());
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\User',
));
}
我不确定你为什么要这样做,但我告诉你一种做法。像 qooplmao 评论的另一种更简单的方法是使用property_path
。