Symfony 2 如何将数组集合传递给输入选择


symfony 2 how to pass array collection to input select

嗨,我正在将传递数组集合(方法getProjects()返回它)绑定到表单(选择输入)并失败。此代码返回异常 - 在传递给选择字段的"Tasker''WebBundle''Entity''Project"类型的对象上找不到"__toString()"方法。

有人可以帮忙吗?需要变压器吗?或者什么是正确的方法?

控制器:

/**
 * @Route("/pridaj", name="web.task.add")
 * @Template()
 */
public function addAction(Request $request)
{
    $task = new Task;
    /** @var User $loggedUser */
    $loggedUser = $this->get('security.token_storage')->getToken()->getUser();
    $form = $this->createForm(new AddTaskType(), $task, ['user' => $loggedUser]);
    if ($form->handleRequest($request) && $form->isValid()) {
        // some stuff
    }

    return [
        'form' => $form->createView()
    ];
}

形式:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('project', 'entity', [
            'label' => 'Projekt:',
            'class' => 'TaskerWebBundle:Project',
            'choices' => $options['user']->getProjects(),
            'placeholder' => 'Označte projekt',
        ])
    // ....
 }

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setRequired(array(
        'user',
    ));
    $resolver->setDefaults(array(
        'user' => null,
    ));
}

只需将__ToString()添加到项目类

Tasker'WebBundle'Entity'Project
class Project
{
    ....
    function __toString() {
        return $this->getName(); //or whatever string you have
    }
}
我想

添加另一个答案,因为您不必将__toString()添加到 Project 类中。 Symfony实体字段类型允许您指定用于显示的属性/字段。 因此,您可以像这样在表单配置中指定属性,而不是__toString()

$builder
    ->add('project', 'entity', [
        'label' => 'Projekt:',
        'class' => 'TaskerWebBundle:Project',
        'choices' => $options['user']->getProjects(),
        'placeholder' => 'Označte projekt',
        'property' => 'name'
    ])

如果您检查 Symfony 文档的这一部分,您将看到仅当您不指定property时才会自动调用__toString()