2013-12-06 1 views
0

Я использую Silex FormBuilder в своем приложении. Структура строителя, как это:Превращение строки в действительный PHP-код в контексте объекта?

$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(); 

Но вместо Еогеасп createBuilder ожидает -> добавить ... метод, и это, где им застрял.

С наилучшими пожеланиями,
Kamil

ответ

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, как так ... Вы бы лучше сохранить параметры для передачи в функцию, чтобы заставить его работать ... Вы могли бы также создайте функцию или класс для обработки типичных элементов, таких как ваш адрес электронной почты, поэтому вам нужно будет всего лишь ссылаться на вид ввода в базе данных, примерно так:

+0

Спасибо! Хотя я немного об eval, но не о пользовательской функции. Причина, по которой я пытаюсь сделать эту странную вещь :-) заключается в том, чтобы избежать создания довольно сложного конструктора определений --- я хотел сделать эту динамику. Когда я добавляю новый тип поля, я хотел бы сделать это из приложения без редактирования исходного кода. Итак, я думаю, что пользовательский ввод неизбежен, но единственным человеком, создающим новые определения, будет я :-) Я думал о подключении редактора JS и определении определения в своем приложении. Есть ли какой-нибудь умный способ сделать eval, см. Раздел clauses? – Kamil

+0

Письмо является только примером. Мое приложение будет иметь дело со всеми видами электроники, а элемент «name» в строителе ссылается на другие свойства в базе данных. Определение 'form_builder' было бы только одним параметром для многих, чтобы сказать «процессор». – Kamil

+0

Извините за беспорядок: о рассмотрении предложений 'use' --- Я должен просто использовать полный путь к определению класса. – Kamil