Я использую 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
Спасибо! Хотя я немного об eval, но не о пользовательской функции. Причина, по которой я пытаюсь сделать эту странную вещь :-) заключается в том, чтобы избежать создания довольно сложного конструктора определений --- я хотел сделать эту динамику. Когда я добавляю новый тип поля, я хотел бы сделать это из приложения без редактирования исходного кода. Итак, я думаю, что пользовательский ввод неизбежен, но единственным человеком, создающим новые определения, будет я :-) Я думал о подключении редактора JS и определении определения в своем приложении. Есть ли какой-нибудь умный способ сделать eval, см. Раздел clauses? – Kamil
Письмо является только примером. Мое приложение будет иметь дело со всеми видами электроники, а элемент «name» в строителе ссылается на другие свойства в базе данных. Определение 'form_builder' было бы только одним параметром для многих, чтобы сказать «процессор». – Kamil
Извините за беспорядок: о рассмотрении предложений 'use' --- Я должен просто использовать полный путь к определению класса. – Kamil