Symfony 4 - 在我的表单中使用服务(query_builder)

Symfony 4 - Use service in my form (in query_builder)

在我的symfony 4项目中,在我的表单中,我想使用一个服务来完成一个select。所以,我这样做了:

表格

public function buildForm(FormBuilderInterface $builder, array $options, GroupeValidateursService $groupeValidateursService)
{
    // $groupeValidateursService = $options['groupeValidateursService'];

    $builder
        ->add('defaultGroupeValidateurs', EntityType::class, [
            'class' => GroupeValidateurs::class,
            'label' => "Service par défaut",
            'placeholder' => "Sélectionnez un service",
            'query_builder' => function () use ($groupeValidateursService) {
                return $groupeValidateursService->getNotDefaultGroups();
            },
            'choice_label' => 'nom',
        ]);
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => ParametresAdmin::class,
        'groupeValidateursService' => GroupeValidateursService::class,
    ]);
}

控制器:

$formDeleteDefaultGroupe = $this->createForm(DeleteDefaultGroupeType::class, $parametresAdmin, [
            "groupeValidateursService" => $this->groupeValidateursService,
        ]);

如果我在我的服务函数中创建一个转储,没关系,我有一个对象数组,就像在存储库的查询中一样。

但是我有这个错误:

Expected argument of type "Doctrine\ORM\QueryBuilder", "array" given

我认为当我从函数服务返回数组时出现问题:

/**
 * Retourne tous les groupes sauf celui par défaut
 *
 * @return array
 */
public function getNotDefaultGroups()
{
    $groupes = $this->repoGroupeValidateurs->findAll();
    $default = $this->getDefaultGroupe();

    $otherGroups = [];

    foreach ($groupes as $groupe) {
        if ($groupe != $default) {
            $otherGroups[] = $groupe;
        }
    }

    return $otherGroups;
}

所以我不明白哪里出了问题

编辑:我这样试过:

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

    $builder
        ->add('defaultGroupeValidateurs', ChoiceType::class, [
            'label' => "Service par défaut",
            'placeholder' => "Sélectionnez un service",
            'choices' => $options['groupeValidateursService']->getNotDefaultGroups(),
            'choice_label' => function ($choice, $key, $value) {
                return $value->getNom();
            }
        ]);
}

但是我有这个错误:

Call to a member function getNom() on string

因此,我将 $value->getNom() 替换为 $choice->getNom()。

但现在我遇到了这个错误:

Argument 1 passed to Symfony\Component\Form\FormRenderer::renderBlock() must be an instance of Symfony\Component\Form\FormView, string given

$formDeleteDefaultGroupe = $this->createForm(DeleteDefaultGroupeType::class, $parametresAdmin, [
            "groupeValidateursService" => $this->groupeValidateursService
        ]);
        $formDeleteDefaultGroupe->handleRequest($request);

EntityType 需要参数中的 QueryBuilder。您正在为 return 数组的选项 'query_builder' 使用匿名函数。您必须 return QueryBuilder 而不是:

use Doctrine\ORM\EntityRepository;

$builder
    ->add('defaultGroupeValidateurs', EntityType::class, [
        'class' => GroupeValidateurs::class,
        'label' => "Service par défaut",
        'placeholder' => "Sélectionnez un service",
        'query_builder' => function (EntityRepository $entityRepository) {
            return $entityRepository->createQueryBuilder('gv')
                ->where('gv.group != :defaultGroup')
                ->setParameters(['defaultGroup' => 'someDefaultGrupIdentifier']);
        },
        'choice_label' => 'nom',
    ]);

如果您真的想使用服务中的功能,您的第二选择是使用 ChoiceType,您可以在其中将选项作为选项传递:

$builder->add('defaultGroupeValidateurs', ChoiceType::class, [
    'choices' => $options['groupeValidateursService']->getNotDefaultGroups(),
    'choice_label' => function ($choice, $key, $value) {
        return $value->getTitle()
    }
]);

更多信息:https://symfony.com/doc/current/reference/forms/types/entity.html#using-a-custom-query-for-the-entities

更多信息:https://symfony.com/doc/current/reference/forms/types/choice.html#example-usage