Symfony2:如何从Type中调用Repository类中的函数

时间:2015-06-09 23:47:26

标签: php symfony repository

我是symfony2 ver 2.7中的新手: 我想在表单中创建注册号,其中包含现有表中计数行的数据。

我在PatientController中创建并以twig格式显示结果时没问题。 但我需要以文本类型的形式显示结果。我在PatientRepository中写了一个函数:

public function getNumberPatient()
{
    $qb = $this->createQueryBuilder('name')
        ->select('COUNT(name)');
    return (int)$qb->getQuery()
        ->getSingleScalarResult();
}

在我的Entity文件中生成如下:

 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",

请帮帮我..

1 个答案:

答案 0 :(得分:3)

有多种方法可以做到:

  • 您可以在控制器中获取数据,然后将其传递给表单,如下所示:
控制器中的

示例:

public function someAction()
{
    $data = $em->getRepository(...)->getNumberPatient();
    $form = $this->createForm(new MyFormType, NULL_OR_OBJECT, [
       'text_data' => $data
    ]);
    ...
}

MyFormType:

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