Symfony2:如何从类型调用存储库 class 中的函数
Symfony2: How to Call functions in Repository class from Type
我是 symfony2 ver 2.7 的新手:
我想用现有 table.
中计数行的数据在表单中创建注册号
当我在 PatientController 中创建并以 twig 格式显示结果时没问题。
但我需要以文本类型的形式显示结果。我在 PatientRepository 中写了一个函数:
public function getNumberPatient()
{
$qb = $this->createQueryBuilder('name')
->select('COUNT(name)');
return (int)$qb->getQuery()
->getSingleScalarResult();
}
并且在我的实体文件中生成如下:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('dateBirth', 'date', array(
'years' => range(date('Y'), date('Y', strtotime('-50 years'))),
'required' => TRUE,
))
->add('regCode', 'text', array(
'required' => TRUE,
'data' => function(PatientRepository $r){
return $r->getNumberPatient();
},
我从 PatientEntity 调用这个函数时遇到了问题。可能吗?
我确实创建了函数:
'query_builder' => function(PatientRepository $r){
return $r->getNumberPatient();
但是报错
The option "query_builder" does not exist. Defined options are: "action",
请帮帮我..
有多种方法可以做到:
- 你可以在controller中获取数据,然后传给form,像这样:
控制器中的示例:
public function someAction()
{
$data = $em->getRepository(...)->getNumberPatient();
$form = $this->createForm(new MyFormType, NULL_OR_OBJECT, [
'text_data' => $data
]);
...
}
我的表单类型:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$data = $options['text_data'];
$builder
->add('regCode', 'text', ['data' => $data])
...
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(['text_data' => null]);
}
- 另一种方式,将您的表单类型声明为服务,注入实体管理器:
示例:
class MyFormType extends AbstractType
{
private $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
// use it like $this->entityManager->...
}
- 另一种方法,将 entityManager 传递给 1-option 形式,然后通过
$options
数组获取,例如 $entityManager = $options['entityManager']
,或者您甚至可以将 entityManager 传递给构造函数.. Here 可以看到..
我是 symfony2 ver 2.7 的新手: 我想用现有 table.
中计数行的数据在表单中创建注册号当我在 PatientController 中创建并以 twig 格式显示结果时没问题。 但我需要以文本类型的形式显示结果。我在 PatientRepository 中写了一个函数:
public function getNumberPatient()
{
$qb = $this->createQueryBuilder('name')
->select('COUNT(name)');
return (int)$qb->getQuery()
->getSingleScalarResult();
}
并且在我的实体文件中生成如下:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('dateBirth', 'date', array(
'years' => range(date('Y'), date('Y', strtotime('-50 years'))),
'required' => TRUE,
))
->add('regCode', 'text', array(
'required' => TRUE,
'data' => function(PatientRepository $r){
return $r->getNumberPatient();
},
我从 PatientEntity 调用这个函数时遇到了问题。可能吗?
我确实创建了函数:
'query_builder' => function(PatientRepository $r){
return $r->getNumberPatient();
但是报错
The option "query_builder" does not exist. Defined options are: "action",
请帮帮我..
有多种方法可以做到:
- 你可以在controller中获取数据,然后传给form,像这样:
控制器中的示例:
public function someAction()
{
$data = $em->getRepository(...)->getNumberPatient();
$form = $this->createForm(new MyFormType, NULL_OR_OBJECT, [
'text_data' => $data
]);
...
}
我的表单类型:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$data = $options['text_data'];
$builder
->add('regCode', 'text', ['data' => $data])
...
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(['text_data' => null]);
}
- 另一种方式,将您的表单类型声明为服务,注入实体管理器:
示例:
class MyFormType extends AbstractType
{
private $entityManager;
public function __construct(EntityManagerInterface $entityManager)
{
$this->entityManager = $entityManager;
}
// use it like $this->entityManager->...
}
- 另一种方法,将 entityManager 传递给 1-option 形式,然后通过
$options
数组获取,例如$entityManager = $options['entityManager']
,或者您甚至可以将 entityManager 传递给构造函数.. Here 可以看到..