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 可以看到..