Symfony 4 - использовать сервис в моей форме (в query_builder) - PullRequest
0 голосов
/ 08 октября 2019

в моем проекте Symfony 4, в моей форме, я хотел бы использовать сервис для завершения выбора. Итак, я сделал это:

Форма

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

Если я сделаю дампумри в моей сервисной функции, все в порядке, у меня есть массив объектов, как в запросе к хранилищу.

Но у меня есть эта ошибка:

Ожидаемый аргумент типа "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);

1 Ответ

1 голос
/ 08 октября 2019

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

...