Symfony 4-以我的形式使用服务(在query_builder中)

问题描述 投票:0回答:1

在我的symfony 4项目中,以我的形式,我想使用一项服务来完成选择。所以,我这样做了:

Form

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,
    ]);
}

Controller:

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

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

但是我有这个错误:

类型为“ Doctrine \ ORM \ QueryBuilder”的预期参数,给出了“数组”

我认为我从函数服务返回数组时有问题:

/**
 * 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();
            }
        ]);
}

但是我有这个错误:

在字符串上调用成员函数getNom()

因此,我将$ 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);
php forms symfony service autowired
1个回答
0
投票

EntityType需要参数中的QueryBuilder。您正在为返回数组的选项'query_builder'使用匿名函数。您必须改为返回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

© www.soinside.com 2019 - 2024. All rights reserved.