как вызвать функцию репозитория сущностей в типе формы в symfony2

я хочу вызвать функцию в классе типа формы. функция генерирует массив и записывается в класс репозитория сущностей. используя этот массив, я создам поле динамической формы. вот функция класса репозитория сущностей.

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.

заранее спасибо.


person Rajesh Vasani    schedule 21.05.2013    source источник


Ответы (2)


Он недоступен в конструкторе форм, и обычно в нем нет необходимости. Это также не совсем то, как работают формы 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. Или просто передайте его непосредственно в тип формы при ее создании.

person Ryan    schedule 21.05.2013

Вам не нужно создавать функцию построителя запросов, и вы можете использовать запрос из репозитория следующим образом:

В виде:

'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, а не результат. Если вам также нужен результат, вам нужно написать функцию поиска в репозитории.

person Ethernal    schedule 21.09.2016