在Symfony 2.4+项目中,为一个字段注册一个值数组的最佳方法是什么,该字段可以保存为整数但需要在模板中显示人类可读的值?
我有一个实体,其属性填充了表示不同常量值的整数值:
/**
* The repetition frequency for billing cycle:
* @ORM\Column(type="smallint")
*/
protected $repetition = 0;
我想在某处存储这些值的名称,所以最初我将它们放在我的实体中并带有一个getter:
protected $repetitionName = array(
0 => 'Setup',
1 => 'Second',
2 => 'Minute',
3 => 'Hour',
4 => 'Day',
5 => 'Week',
6 => 'Month',
7 => 'Year'
);
public function getRepetitionName() {
return $this->repetitionName;
}
这似乎是价值观的重要中央存储库。
然后在我的树枝模板中,我不想显示整数,我想要相应的名称值。所以我这样翻译它们:
<div class="billingCycle">{{ entity.repetitionName[entity.repetition] }}</div>
在我的表单构建器中,我创建了一个引用该数组的字段:
$builder->add('repetition', 'choice', array(
'label' => 'Billing Cycle',
'help' => 'The repetition frequency when this service is billed.',
'choices' => $builder->getData()->getRepetitionNamePer(),
// default to monthly (the most common)
'empty_data' => 6,
'required' => TRUE
));
1。翻译:如果我想在任何时候翻译它,它会在一个地方进行硬编码。
2。可重用性:如果我有其他具有重复的实体(例如事件日历),那么重用它会很好。
第3。可配置性:理想情况下,这些可以在配置文件中编辑,而不是实体代码。
更好的选择似乎在配置文件中设置了一些默认参数:
parameters:
gutensite_component.options.status:
0: Inactive
1: Active
gutensite_component.options.repetition:
0: Setup
1: Second
2: Minute
3: Hour
4: Day
5: Week
6: Month
7: Year
然后创建一个自定义表单类型Gutensite\ComponentBundle\FormType\RepetitionType
,从配置参数加载选项。 See the Documentation for a great example of this。然后只需参考这样的字段类型:
$builder->add('repetition', 'repetition', array(
'label' => 'Billing Cycle',
'help' => 'The repetition frequency when this service is billed.',
// default to monthly (the most common)
'empty_data' => 6,
'required' => TRUE
));
此解决方案的一个不方便的部分是,您必须在配置中使用twig参数(即使您不需要它,每个模板都会膨胀),或者始终记得手动将参数传递给来自你的控制器的树枝。
// I add to the standard object `$controller->view` which gets passed to Twig
$controller->view->options['repetition'] = $this->container->getParameter('gutensite_component.options.repetition');
可以访问:
<div class="priceValue label label-primary">${{ entity.price }}/<span class="billingCycle">{{ view.options.repetition[entity.repetition] }}</span></div>
这比我想要的更笨重,但它是可重复使用的。也许其他人有better solutions to pass the configuration to twig than what is represented here。
您是否有任何其他建议,最佳做法或经验教训?请分享。
答案 0 :(得分:0)
我要做的是将这些值保存为新实体的对象,并设置从main entity
(或任何其他实体calendar event entity
)到repetition entity
的manyToOne关系
如果是这样,您可以在每次需要时轻松添加新的重复项,或者使用任何特定的重复项来获取main entity
的所有对象。
此外,您可以为main entity
的新对象构建一个漂亮的表单,其中包含重复值的输入(人类可读):
$builder->add('repetition', 'entity', array(
'class' => 'AcmeDefaultBundle:Repetition', // This is your new 'repetition entity'
'property' => 'repetitionName', // The field of your 'repetition entity' that stores the name (the one that will show a human readable value instead of the id)
'expanded' => true, // True if you prefer checkbox instead of a dropdown list
'label' => 'Billing Cycle',
'help' => 'The repetition frequency when this service is billed.',
'required' => true,
));
现在,当您想要在树枝中显示重复的名称时,您将使用:
<div class="billingCycle">{{ entity.Repetition.repetitionName }}</div> (you can also translate that value later)
答案 1 :(得分:0)
更简洁的方法(如果仅将它用于此实体)是在实体中定义一个返回该数组的公共方法:
public function getRepetitionNames() {
return array(
0 => 'Setup',
1 => 'Second',
2 => 'Minute',
3 => 'Hour',
4 => 'Day',
5 => 'Week',
6 => 'Month',
7 => 'Year'
);
}
根据“重复”字段值检索标签的另一种方法:
/**
* @param $key
* @return null
*/
function getRepetitionLabel(){
$repetitions = $this->getRepetitionNames();
return isset($repetitions[$this->repetition]) ? $repetitions[$this->repetition] : 0;
}
现在更容易在枝条中访问它:
<div class="billingCycle">{{ entity.repetitionLabel }}</div>
最后,在您的表单中使用您的实体来检索值:
$object = $builder->getData();
$repetitionChoices = $object->getRepetitionNames();
$builder->add('repetition', 'choice', array(
'label' => 'Billing Cycle',
'help' => 'The repetition frequency when this service is billed.',
'choices' => $repetitionChoices
'empty_data' => 6,
'required' => TRUE
));
如果您计划在更多实体中使用它,您可以使用界面。