以 Symfony 2.6 形式更改选项的字符串表示

Changing string representation of choices in a Symfony 2.6 form

我正在构建一个表单类型,它使用表单字段订阅者来呈现一些表单字段。

订阅者 returns 表单选项给定字段。其中一个选项是 "choices":

    $formOptions = [
        ...
        'choices' => $choices,
    ];

$choices是实体。
因此,它们将通过对象的__toString()呈现在表单中。

__toString() 方法类似于:

public function __toString()
{
    return $this->getName();
}

但是,我希望 "choices" 表示为 $name . $id(名称与对象 ID 连接)。
同时,我不想修改对象的__toString() 方法,因为我只希望在这个表单字段中使用不同的字符串表示形式,而不是在整个系统中。

我有哪些选项?
我是否可以对 Symofny 表单字段显示已通过选项的方式进行精细控制?

从 Symfony 2.7 开始,您可以使用带有回调的 choice_label 选项来动态创建您选择的标签:

$builder->add('name', 'choice', array(
    'choices' => ...,
    'choice_label' => function ($choice) {
        return $choice->name.$choice->id;
    },
));

此示例假定您的选择是具有 public $id$name 属性的对象。

你可以试试这样的东西吗? :

$formChoices = [];
foreach ($choices as $key => $entity) {
   $formChoices[$entity->getId()] = sprintf('%s %s', $entity->getName(), $entity->getId());
}

$formOptions = [
        ...
        'choices' => $formChoices,
    ];

可以根据entity field documentation 2.6

使用属性选项
$builder->add('users', 'entity', array(
    'class' => 'AcmeHelloBundle:User',
    'property' => 'customToString',
));

只需确保 属性 名称与方法名称匹配

    /**
     * @return string 
     * Here you print the attributes you need
     */
    public function customToString()
    {
        return sprintf(
            '%s,
            $this->$name . $this->$id,


        );
    }