表单以不同的名称映射到类

时间:2015-12-22 18:44:46

标签: symfony

我想将我的班级与表格联系起来。我是否有可能为表格提供不同于课堂上的名字?例如,类具有属性用户名,但我希望在表单中映射到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;

  //...
}

2 个答案:

答案 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