使用选择字段进行表单渲染可怕的性能

时间:2015-05-17 04:11:41

标签: symfony symfony-forms

我在创建的表单中有多种选择字段,但所有这些字段都是从代码中定义的PHP数组加载的。 createForm()被赋予一个空模型。每个字段,当用form_row()在树枝上渲染大约2秒进行渲染时,每个字段都要求大约8或9秒,这很荒谬。我尝试过搜索,阅读等等,据我所知,我遵循最佳做法。没有运行数据库查询。请帮我解决这个巨大的性能问题。

让我们从表单类型开始:

class SubscriptionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('latitude', 'hidden')
            ->add('longitude', 'hidden')
            ->add('crop', 'choice', [
                'choices' => Crop::getFormChoices(),
                'required' => true,
            ])
            ->add('infliction', 'choice', [
                'choices' => Infliction::getFormChoices(),
                'required' => true,
            ])
            ->add('emergenceDate', 'date')
            ->add('threshold', 'choice', [
                'choices' => Threshold::getFormChoices(),
                'label' => 'Severity threshold',
                'required' => true,
            ])
            ->add('save', 'submit', ['label' => 'Subscribe']);
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults([
            'data_class' => 'PlantPath\Bundle\VDIFNBundle\Entity\Subscription',
        ]);
    }

    public function getName()
    {
        return 'subscription';
    }
}

然后,在我的控制器中:

public function formAction(Request $request)
{
    $subscription = new Subscription();

    $form = $this->createForm(new SubscriptionType(), $subscription);

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        // ...
    }

    return $this->render('PlantPathVDIFNBundle:Subscription:form.html.twig', [
        'form' => $form->createView(),
    ]);
}

订阅/ form.html.twig:

{{ form_start(form, {'attr': {'id': 'subscription-form'}}) }}
{{ form_row(form.crop) }}
{{ form_row(form.infliction) }}
{{ form_row(form.emergenceDate) }}
{{ form_row(form.threshold) }}
{{ form_end(form) }}

正如我所提到的,每次拨打form_row()都需要两秒钟。如果我取出所有form_row()form_end(),则会在几毫秒内呈现模板(没有表单)。我无法理解为什么Symfony需要超过8秒的时间才能为空白表单呈现几行HTML。

1 个答案:

答案 0 :(得分:0)

用于在bootstrap_3_layout.html.twig中呈现选项字段的块包含“| trans”过滤器,该过滤器尝试查找每个选项的翻译。 如果您不想翻译,请覆盖twig文件中的choice_widget_options块。这应该消除由于翻译而引起的警告消息。