我在我的应用程序中使用Silex FormBuilder。构建器的结构如下:
$form = $app['form.factory']->createBuilder('form')
->add('name', 'text', array(
'constraints' => array(new Assert\NotBlank(), new Assert\Length(array('min' => 5)))
))
->add('email', 'text', array(
'constraints' => new Assert\Email()
))
->add('gender', 'choice', array(
'choices' => array(1 => 'male', 2 => 'female'),
'expanded' => true,
'constraints' => new Assert\Choice(array(1, 2)),
))
->getForm();
假设我将从块构建这样的构建器,这些块将作为整体存储在数据库中。总是,我会创建的任何形式,我知道,电子邮件字段将始终定义相同。所以我会从数据库中获取定义并预先创建表单。
->add('email', 'text', array(
'constraints' => new Assert\Email()))
当我从数据库(在我的情况下为posgresql)中获取此信息时,这将是一个字符串(因为数据库字段是文本类型)。
我的问题:是否有可能将其转换为有效代码?
我想到了这样的事情:
$form = $app['form.factory']->createBuilder('form')
foreach ($definitions as $definition) {
something to do with the $definition;
}
->getForm();
但是,而不是foreach,createBuilder期望 - > add ...方法,这就是我陷入困境的地方。
最诚挚的问候,
卡米尔
答案 0 :(得分:0)
/*Concidering $definitions = array("$form->add('email', 'text', array(
'constraints' => new Assert\Email()
));");
*/
$form = $app['form.factory']->createBuilder('form');
foreach($definitions as $definition){
eval($definition);
}
$form->getForm();
我不建议您像这样使用eval ...您最好存储参数以传递给函数以使其工作...您还可以创建一个函数或类来处理典型元素,例如您的电子邮件,所以你只需要引用数据库中的输入类型,有点像:
function addFormElement(&$form,$type){
switch($type){
case 'email':$form->add('email', 'text', array(
'constraints' => new Assert\Email()
));
break;
}
}
/*Concidering $definitions = array("email");
*/
$form = $app['form.factory']->createBuilder('form');
foreach($definitions as $definition){
addFormElement($form,$definition);
}
$form->getForm();