如何在symfony2中调用表单类型中的实体存储库的功能

时间:2013-05-21 05:54:00

标签: symfony entity symfony-2.2 formbuilder

我想在表单类型类中调用函数。 function generate array,写在实体存储库类中。使用该数组我将生成动态表单字段。 这是实体存储库类函数。

public static $roleNameMap = array(
            self::ROLE_SUPER_ADMIN => 'superAdmin',
            self::ROLE_MANAGEMEN => 'management',
            self::ROLE_MANAGERS => 'manager',
            self::ROLE_IT_STAFF => 'itStaff',
            self::ROLE_CS_CUSTOMER => 'csCustomer',
            self::ROLE_CS => 'cs',
            self::ROLE_DEALER => 'dealer',
            self::ROLE_ACCOUNT_STAFF => 'accountStaff',
            self::ROLE_BROKER_USER => 'staff',
    );

    public function getGroupListArray()
        {
            $qb = $this->createQueryBuilder('g')
                ->orderBy('g.hierarchy','ASC');
            $query = $qb->getQuery();
            $groupList = $query->execute();
            $roleNameMap = array();
            foreach ($groupList as $role){
                $roleNameMap[$role->getId()] = $role->getRole();
            }

            return $roleNameMap;
        }

下面是我的表单构建器类,我想在上面调用实体存储库函数。

public function buildForm(FormBuilderInterface $builder, array $options) {

        $builder->add('routeId', 'hidden');

        foreach (GroupListRepository::$roleNameMap as $key=>$value){
            $builder->add($value, 'checkbox',array('label' => '', 'required' => false,));
        }       
    }

我能够获得上面代码中显示的静态变量但是,我对如何在symfony2中的表单构建器类中访问存储库函数感到困惑。

提前谢谢。

2 个答案:

答案 0 :(得分:5)

表单构建器中没有它,通常不需要它。它也不是Symfony如何形成的。对于你想要做的事情,你可以尝试这样的事情。它将创建一个与角色列表对应的复选框列表。

$builder->add(
  'roles',
  'entity',
  array(
    'class' => 'Acme\DefaultBundle\Entity\Group',
    'expanded' => true,
    'multiple' => true,
    'property' => 'role', // Or use __toString()
    'query_builder' => function ($repository) {
      return $repository->createQueryBuilder('g')
        ->orderBy('g.hierarchy', 'ASC');
    }            
  )
);

请参阅http://symfony.com/doc/master/reference/forms/types/entity.html

如果您确实需要表单构建器中的存储库,则将表单类型创建为服务,并向实体管理器注入DIC。或者在创建时直接将其传递给表单类型。

答案 1 :(得分:1)

您不需要创建查询构建器功能,并且可以使用来自存储库的查询,如下所示:

表格形式:

'query_builder' => function(MyCustomEntityRepository $ttr) {
    return $ttr->queryForCustomResultsWithQueryBuilder();
}

在存储库中:

public function queryForCustomResultsWithQueryBuilder($published=true) {
    $queryBuilder =  $this->getEntityManager()->createQueryBuilder();

    return $queryBuilder->select('tt')
            ->from('ifm\CustomBundle\Entity\CustomEntity','tt')
            ->where('tt.published = ?1')
            ->orderBy('tt.code', 'ASC')
            ->setParameters(array(1=>$published))
    ;
}

请注意,queryForCustomResultsWithQueryBuilder返回的是QueryBuilder而不是结果。如果你还需要一个结果,你需要在reposiory中写一个find函数。