如何创建一个从 mysql 数据库中提取数据并在 Symfony 4 中构建表单的动态函数?

How can I create a dynamic function that pulls data from mysql database and builds a form in Symfony 4?

我想构建一个控制器,它将从数据库加载数据并从中构建一个表单,但这取决于 slug。

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

所以这意味着,如果 slug 是 products 那么我想从我的数据库 table `products 中构建一个表单,其中包含此 table 中的所有字段:

所以在 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 table 中字段是 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')))

我现在的问题是如何创建这个取决于 slug 的字段。我正在考虑以某种方式从对象 $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 构建表单结构。但这似乎也不是正确的方法。

您是否使用过从数据库 table 动态加载数据并创建表单的函数?我对每一个想法或建议都很满意。

你可以试试这样的

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

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

这将为您提供基于 Doctrine 的元数据模型的实体的所有字段。

查看 ClassMetadata API documentation 了解更多信息,尤其是您将获得的信息。

例如你可以使用

  • isNullable(string $fieldName) 确保一些 'mandatory validation'
  • getIdentifierColumnNames()排除所有标识符列(注意:这将return列名不是实体字段,但你可以很容易地识别这些
  • getTypeOfField 获取字段是字符串还是数字的一些提示(再次允许更具体的表单属性)
  • 等等...只需查看文档并尝试一下

但通常要小心使用 ClassMetadata,因为您的用例并不是它真正的用途 - 但我们也将它用于类似的情况。