如何创建一个从 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,因为您的用例并不是它真正的用途 - 但我们也将它用于类似的情况。
我想构建一个控制器,它将从数据库加载数据并从中构建一个表单,但这取决于 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,因为您的用例并不是它真正的用途 - 但我们也将它用于类似的情况。