Symfony forms 声明Symfony表单选项(Sym 2.8/3.0)
我正在寻找在表单中创建/添加动态选项的最佳方法。所谓选项,我指的是选择值对,甚至是默认值。我至少可以看到三种选择: 1) 添加表单类型时,将选项添加到Symfony forms 声明Symfony表单选项(Sym 2.8/3.0),symfony-forms,symfony,symfony-2.8,Symfony Forms,Symfony,Symfony 2.8,我正在寻找在表单中创建/添加动态选项的最佳方法。所谓选项,我指的是选择值对,甚至是默认值。我至少可以看到三种选择: 1) 添加表单类型时,将选项添加到$options数组中。为此,我必须首先声明一个默认值,然后将它们添加到add方法和控制器中: $choices = []; foreach ($pages as $page) { $choices[$page->getId()] = $page->getTitle(); } $optio
$options
数组中。为此,我必须首先声明一个默认值,然后将它们添加到add
方法和控制器中:
$choices = [];
foreach ($pages as $page) {
$choices[$page->getId()] = $page->getTitle();
}
$options = ['pages' => $choices];
$form = $this->createForm('MyBundle\Form\Type\PageType', $data, $options);
控制器:
$choices = [];
foreach ($pages as $page) {
$choices[$page->getId()] = $page->getTitle();
}
$options = ['pages' => $choices];
$form = $this->createForm('MyBundle\Form\Type\PageType', $data, $options);
表单类型:
class PageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('pid', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', [
'choices' => $options['pages'],
'label' => __('Page')
]);
}
...
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'pages' => []
]);
}
}
class PageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('pid', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', [
'choices' => $options['pages'],
'label' => __('Page')
]);
}
...
public function configureOptions(OptionsResolver $resolver)
{
$choices = [];
$pages = $this->getPages();
foreach ($pages as $page) {
$choices[$page->getId()] = $page->getTitle();
}
$resolver->setDefaults([
'pages' => $choices
]);
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$choices = [];
$pages = $this->getPages();
foreach ($pages as $page) {
$choices[$page->getId()] = $page->getTitle();
}
$builder
->add('pid', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', [
'choices' => $choices,
'label' => __('Page')
]);
}
2) 如果这些值不依赖于控制器值,那么我似乎可以在选项resolver
中创建它们(假设可以访问源数据)
表单类型:
class PageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('pid', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', [
'choices' => $options['pages'],
'label' => __('Page')
]);
}
...
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'pages' => []
]);
}
}
class PageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('pid', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', [
'choices' => $options['pages'],
'label' => __('Page')
]);
}
...
public function configureOptions(OptionsResolver $resolver)
{
$choices = [];
$pages = $this->getPages();
foreach ($pages as $page) {
$choices[$page->getId()] = $page->getTitle();
}
$resolver->setDefaults([
'pages' => $choices
]);
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$choices = [];
$pages = $this->getPages();
foreach ($pages as $page) {
$choices[$page->getId()] = $page->getTitle();
}
$builder
->add('pid', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', [
'choices' => $choices,
'label' => __('Page')
]);
}
3) 最后,我还可以添加buildForm
方法(再次假设访问源数据):
表单类型:
class PageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('pid', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', [
'choices' => $options['pages'],
'label' => __('Page')
]);
}
...
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'pages' => []
]);
}
}
class PageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('pid', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', [
'choices' => $options['pages'],
'label' => __('Page')
]);
}
...
public function configureOptions(OptionsResolver $resolver)
{
$choices = [];
$pages = $this->getPages();
foreach ($pages as $page) {
$choices[$page->getId()] = $page->getTitle();
}
$resolver->setDefaults([
'pages' => $choices
]);
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$choices = [];
$pages = $this->getPages();
foreach ($pages as $page) {
$choices[$page->getId()] = $page->getTitle();
}
$builder
->add('pid', 'Symfony\Component\Form\Extension\Core\Type\ChoiceType', [
'choices' => $choices,
'label' => __('Page')
]);
}
显然,第一个选项具有最大的灵活性,但是如果我不需要这种灵活性,或者出于某种原因不想管理控制器中的选项,那么在
buildForm
或configureOptions
方法中进行工作是否更有意义?如果需要灵活性,则不能使用解决方案3。但如果您想避免灵活性,解决方案3是最好的
解决方案1和2可以,这取决于您需要什么:
- 如果在多个具有不同选项的操作中使用表单:使用解决方案1,但在此选项上添加一个要求,以防止在没有选项的情况下调用表单
- 如果您的选择通常是相同的,但您只想在某些时候覆盖它们:选择解决方案2
$this->pages
,在您的示例中),它总是会更好
关于如果您使用条令实体,您应该使用以下方法:
使用Symfony\Bridge\doctor\Form\Type\EntityType;
// ...
$builder->add('pid',EntityType::类,数组(
'class'=>'AppBundle:Page',
“选择标签”=>“标题”,
));
要使用其他类型的对象,请执行以下操作:
使用Symfony\Component\Form\Extension\Core\Type\ChoiceType;
使用AppBundle\Entity\Page;
// ...
$builder->add('pid',ChoiceType::class[
“选择”=>[
新建页面(“第1页”),
新建页面(“第2页”),
新建页面(“第3页”),
新建页面(“第4页”),
],
“选择作为值”=>true,
'choice_label'=>函数($page、$key、$index){
/**@var Page$Page*/
返回$page->getTitle();
}
]);
您可以阅读更多信息。
这是一个很好的想法,但我在假设一个通用的例子,它可能或可能不使用实体作为数据源。我也同意解决方案1是最优的,3是最简单的,但是需要外部依赖性(因此可能是服务定义)。这并不好,因为表单只是偶尔使用,在其他实例中没有重用。