Как я могу создать динамическую функцию, которая извлекает данные из базы данных mysql и создает форму в Symfony 4? - PullRequest
0 голосов
/ 30 августа 2018

Я хочу построить контроллер, который будет загружать данные из базы данных и создавать из нее форму, но в зависимости от слага.

public function form($slug, Request $request){
   $EntityName = 'App\\Entity\\' . ucwords($slug);
   $item= $this->getDoctrine()->getRepository($EntityName)->find($id);
   $form = $this->createFormBuilder($item)

Таким образом, это означает, что если slug, например, products, то я хочу построить форму из моей таблицы базы данных `products со всеми полями, которые находятся внутри этой таблицы:

Так что в products у меня есть, например, поля id, name, color. Таким образом, выход мне нужно будет

  ->add('id', TextType::class, array('attr' => array('class' => 'form-control')))
  ->add('name', TextType::class, array('attr' => array('class' => 'form-control')))
  ->add('color', TextType::class, array('attr' => array('class' => 'form-control')))

Но если мой slug, например, members, а в моей таблице members поля id, username, email, то должна быть построена форма с этими полями:

 ->add('id', TextType::class, array('attr' => array('class' => 'form-control')))
  ->add('username', TextType::class, array('attr' => array('class' => 'form-control')))
  ->add('email', TextType::class, array('attr' => array('class' => 'form-control')))

Проблема для меня сейчас в том, как создать эти поля, которые зависят от слага. Я думал как-то получить поля от объекта $item. Это объект $item:

 object(App\Entity\Members)#4788 (6) {
      ["id":"App\Entity\Members":private]=>
      int(9)
      ["username":"App\Entity\Members":private]=>
      string(13) "123"
      ["plainPassword":"App\Entity\Members":private]=>
      NULL
      ["password":"App\Entity\Members":private]=>
      string(0) ""
      ["email":"App\Entity\Members":private]=>
      string(7) "1@12.sw"
      ["isActive":"App\Entity\Members":private]=>
      bool(true)
    }

Я пытался работать с get_object_vars, но это не работает с частными объектами, поэтому я думаю, что это не очень хорошее решение. Я также попытался создать массив ($array = (array) $item;) из объекта для построения структуры формы с помощью foreach. Но это тоже не похоже на правильный путь.

Есть ли у вас опыт работы с функциями, которые динамически загружают данные из таблиц базы данных и создают форму? Я рад за каждую идею или совет.

1 Ответ

0 голосов
/ 30 августа 2018

Вы можете попробовать что-то вроде этого

$cmf = $em->getMetadataFactory();
$class = $cmf->getMetadataFor($entityName);

foreach ($class->fieldMappings as $fieldMapping) {
  echo $fieldMapping['fieldName'] . "\n";
}

Это даст вам все поля для вашей сущности на основе модели метаданных Doctrine.

Ознакомьтесь с Документацией по ClassMetadata API для получения дополнительной информации и особенно информации, которую вы там получите.

например. Вы могли бы использовать что-то вроде

  • isNullable(string $fieldName) для обеспечения некоторой «обязательной проверки»
  • getIdentifierColumnNames() для исключения всех столбцов идентификаторов (примечание: при этом будут возвращены имена столбцов, а не поля сущностей, но вы легко можете определить эти
  • getTypeOfField чтобы получить подсказку, является ли поле строкой или числом (опять же, чтобы разрешить более конкретные атрибуты формы)
  • и т.д ... просто проверьте документацию и попробуйте

НО, как правило, будьте осторожны с использованием ClassMetadata, так как ваш вариант использования не совсем то, для чего он предназначен - но мы используем его и для аналогичного случая.

...