我如何在树枝模板中显示 ChoiceType 键

How do i display a ChoiceType key in a twig template

假设我正在使用 symfony 表单生成器构建以下表单:

$builder->add('version', ChoiceType::class, [
    'choices'   => [
        'Wheezy'    => 7,
        'Jessie'    => 8,
        'Stretch'   => 9
    ]
])

稍后我需要从树枝模板访问它,例如显示 table:

...
<td>{{ entity.version }}</td>
<td>{{ entity.foo }}</td>
<td>{{ entity.bar }}</td>
...

如果我这样做,我最终得到的版本等于 789 ,并且我不想执行以下操作,这显然会破坏它的目的:

$builder->add('version', ChoiceType::class, [
    'choices'   => [
        'Wheezy'    => "Wheezy",
        'Jessie'    => "Jessie",
        'Stretch'   => "Stretch"
    ]
])

如何在不将其映射到我的模板中的情况下执行此操作?我也真的很想避免做一个完整的实体,对于这么少的条目来说太过分了。我很确定或者至少我希望 symfony 已经捆绑了一些东西来处理这种情况,谢谢。

您要么需要这样做,但它会在您的数据库中使用更多 space:

$builder->add('version', ChoiceType::class, [
    'choices'   => [
        'Wheezy'    => "Wheezy",
        'Jessie'    => "Jessie",
        'Stretch'   => "Stretch"
    ]
]);

或者在你的实体中处理,例如:

class Entity {
    const VERSIONS = [
        'Wheezy'  => 7,
        'Jessie'  => 8,
        'Stretch' => 9
    ];

    // code

    public function getVersion($string = false) {
        if ($string && \in_array($this->version, self::VERSIONS))
            return \array_search($this->version, self::VERSIONS);

        return $this->version;
    }
}

在您的表单生成器中,您只需将选项设置为版本的实体列表。

$builder->add('version', ChoiceType::class, [
    'choices' => Entity::VERSIONS
]);

最后在模板中将 getter $string 值设置为 true

...
<td>{{ entity.version(true) }}</td>
<td>{{ entity.foo }}</td>
<td>{{ entity.bar }}</td>
...

默认情况下,getter getVersion 的行为将照常进行,如果将 $string 布尔参数设置为 true,它会将值呈现为字符串

编辑: 您没有添加任何有关 PHP 版本的信息,因此我假设您至少使用 7.0 版,因此使用 return 类型声明。另请注意,您至少需要 PHP 5.6 才能将数组用作常量值。