Symfony2表单给出了关于FormView的可捕获错误

时间:2013-09-30 20:49:41

标签: php symfony twig symfony-forms

这真的很奇怪,它发生在更新Twig模板之后:

控制器部分

    $registration = new Registration();
    $form = $this->createForm(new RegistrationType(), $registration, array(
        'action' => $this->generateUrl('account_create'),
    ));

    return $this->render(
        'AcmeCommonBundle:Security:register.html.twig',
        array(
            'form' => $form->createView(),
            'contentBackColor' => 'canvasGreen'
            )
    );

模板部分

{{ form_start(form) }}
    {{ form_errors(form) }}

    <p>All Fields Are Required</p>

    <div class="form-row">
        {{ form_label(form.firstname, "First Name") }}
        {{ form_widget(form.firstname) }}
        <div class="clear-fix"></div>
    </div>
    <div class="form-errors-row">
        {{ form_errors(form.firstname) }}
    </div>

    <div class="form-row">
        {{ form_label(form.lastname, "Last Name") }}
        {{ form_widget(form.lastname) }}
        <div class="clear-fix"></div>
    </div>
    <div class="form-errors-row">
        {{ form_errors(form.lastname) }}
    </div>

    <div class="form-row">
        {{ form_label(form.username, "Username") }}
        {{ form_widget(form.username) }}
        <div class="clear-fix"></div>
    </div>
    <div class="form-errors-row">
        {{ form_errors(form.username) }}
    </div>

    <div class="form-row">
        {{ form_label(form.email, "Email") }}
        {{ form_widget(form.email) }}
        <div class="clear-fix"></div>
    </div>
    <div class="form-errors-row">
        {{ form_errors(form.email) }}
    </div>

    <div class="form-row">
        {{ form_label(form.password, "Password") }}
        {{ form_widget(form.password) }}
        <div class="clear-fix"></div>
    </div>
    <div class="form-errors-row">
        {{ form_errors(form.password) }}
    </div>

    <div class="form-row">
        {{ form_label(form.confirm, "Confirm Password") }}
        {{ form_widget(form.confirm) }}
        <div class="clear-fix"></div>
    </div>
    <div class="form-errors-row">
        {{ form_errors(form.confirm) }}
    </div>

    <div class="form-row">
        {{ form_label(form.terms, "Terms & Conditions") }}
        {{ form_widget(form.terms) }}
        <div class="clear-fix"></div>
    </div>
    <div class="form-errors-row">
        {{ form_errors(form.terms) }}
    </div>

{{ form_end(form) }}

错误

Argument 1 passed to Symfony\Component\Form\FormRenderer::searchAndRenderBlock() must be an instance of Symfony\Component\Form\FormView, null given

正如你可以清楚地看到的那样,我确实在渲染FormView,而且它是null的事实会让我相信这与RegistrationType()类相关,但是没有任何改变,仅在模板中进行渲染?

1 个答案:

答案 0 :(得分:5)

好吧,这是非常具体的,我想出来了,所以我想我会在这里更新任何在Google上发现这一点的人。

问题是我在表格中的原始实现在树枝上看起来像这样:

{{ form(form) }}

这样做是通过整个form变量并显示要显示的所有内容。

问题在于我的视图变量是错误的。这是因为RegistrationType()对象添加了另一个UserType()对象作为user字段,如下所示:

->add('user', new UserType())

这意味着通话:

{{ form_label(form.firstname, "First Name") }}

应该是:

{{ form_label(form.user.firstname, "First Name") }}

我没有发现这个错误的主要原因是因为Twig给出的错误并没有告诉我哪个表单调用失败了,我自动认为它是第一个,{{ form_start(form) }}。不过那个电话很好。

我查看了显示的HTML并注意到它有多远,这使我调查了问题的特定行。

Twig模板 now 如下所示并正确呈现:

{{ form_start(form) }}
    {{ form_errors(form) }}

    <p>All Fields Are Required</p>

    <div class="form-row">
        {{ form_label(form.user.firstname, "First Name") }}
        {{ form_widget(form.user.firstname) }}
        <div class="clear-fix"></div>
    </div>
    <div class="form-errors-row">
        {{ form_errors(form.user.firstname) }}
    </div>

    <div class="form-row">
        {{ form_label(form.user.lastname, "Last Name") }}
        {{ form_widget(form.user.lastname) }}
        <div class="clear-fix"></div>
    </div>
    <div class="form-errors-row">
        {{ form_errors(form.user.lastname) }}
    </div>

    <div class="form-row">
        {{ form_label(form.user.username, "Username") }}
        {{ form_widget(form.user.username) }}
        <div class="clear-fix"></div>
    </div>
    <div class="form-errors-row">
        {{ form_errors(form.user.username) }}
    </div>

    <div class="form-row">
        {{ form_label(form.user.email, "Email") }}
        {{ form_widget(form.user.email) }}
        <div class="clear-fix"></div>
    </div>
    <div class="form-errors-row">
        {{ form_errors(form.user.email) }}
    </div>

    <div class="form-row">
        {{ form_label(form.user.password.password, "Password") }}
        {{ form_widget(form.user.password.password) }}
        <div class="clear-fix"></div>
    </div>
    <div class="form-errors-row">
        {{ form_errors(form.user.password.password) }}
    </div>

    <div class="form-row">
        {{ form_label(form.user.password.confirm, "Confirm Password") }}
        {{ form_widget(form.user.password.confirm) }}
        <div class="clear-fix"></div>
    </div>
    <div class="form-errors-row">
        {{ form_errors(form.user.password.confirm) }}
    </div>

    <div class="form-row">
        {{ form_label(form.terms, "Terms & Conditions") }}
        {{ form_widget(form.terms) }}
        <div class="clear-fix"></div>
    </div>
    <div class="form-errors-row">
        {{ form_errors(form.terms) }}
    </div>

{{ form_end(form) }}