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/choice.html#example-usage
在我的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/choice.html#example-usage