Symfony2:将选项传递给buildForm

Afu*_*kwa 13 php symfony

所以我对Symfony很新,我试图让控制器基于控制器动作构建略有不同的形式.现在,我有这个

//in Controller

public function addLocationEntryAction(Request $request)
{
    $entry = new Entry();
    $form = $this->get('form.factory')->create(new EntryType('addLocation'), $entry);

    return $this->render('OOTNBlogBundle:Blog:addEntry.html.twig', array(
        'form' => $form->createView()
    ));
}

public function addArticleEntryAction(Request $request)
{
    $entry = new Entry();
    $form = $this->get('form.factory')->create(new EntryType('addArticle'), $entry);

    return $this->render('OOTNBlogBundle:Blog:addEntry.html.twig', array(
        'form' => $form->createView()
    ));
}
Run Code Online (Sandbox Code Playgroud)

//in EntryType

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

    $builder
        ->add('title',      'text')
        ->add('continent',  'text', array('required' => false))
        ->add('country',    'text', array('required' => false))
        ->add('category',   'text', array('required' => false))
        ->add('author',     'hidden')
        ->add('type',       'hidden')
        ->add('text',       'textarea')
        ->add('post',       'submit')
    ;
}
Run Code Online (Sandbox Code Playgroud)

我想从控制器传递一个选项buildForm,这样我就可以这样做:

public function buildForm(FormBuilderInterface $builder, array $options, $option)
{
    $builder
        ->add('title',      'text')
    ;

    if($option == 'addLocation')
    {
        $builder
            ->add('continent',  'text', array('required' => false))
            ->add('country',    'text', array('required' => false))
        ;
    }
    elseif($option == 'addArticle')
    {
        $builder
            ->add('category',   'text', array('required' => false))
        ;
    }

    $builder
        ->add('author',     'hidden')
        ->add('type',       'hidden')
        ->add('text',       'textarea')
        ->add('post',       'submit')
    ;
}
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?我在这里检查了Symfony doc和类似的问题,但似乎没有什么比我的情况更合适.我不知道.

b.b*_*4rd 17

无需创建其他参数,只需用于options传递自定义数据.在以下示例中,我将age属性设为必需,您可以将其设为可选或指定默认值.了解更多关于OptionsResolver 这里

class ExampleType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        var_dump($options['age']);
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setRequired(array(
            'age'
        ));

    }
}
Run Code Online (Sandbox Code Playgroud)

创建:

$form = $this->get('form.factory')->create(new ExampleType(), $entry, array(
    'age' => 13
));
Run Code Online (Sandbox Code Playgroud)

  • 请注意,不推荐使用`setDefaultOptions`来支持`configureOptions`.http://symfony.com/blog/new-in-symfony-2-7-form-and-validator-updates#deprecated-setdefaultoptions-in-favor-of-configureoptions (3认同)