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

JRL*_*JRL 5 php symfony-forms symfony twig

这真的很奇怪,它发生在更新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'
            )
    );
Run Code Online (Sandbox Code Playgroud)

模板部分

{{ 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) }}
Run Code Online (Sandbox Code Playgroud)

错误

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

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

JRL*_*JRL 5

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

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

{{ form(form) }}
Run Code Online (Sandbox Code Playgroud)

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

问题是我的观点变量是错误的.这是因为该RegistrationType()对象将另一个对象添加UserType()为如下user字段:

->add('user', new UserType())
Run Code Online (Sandbox Code Playgroud)

这意味着通话:

{{ form_label(form.firstname, "First Name") }}
Run Code Online (Sandbox Code Playgroud)

本来应该:

{{ form_label(form.user.firstname, "First Name") }}
Run Code Online (Sandbox Code Playgroud)

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

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

Twig模板现在看起来像这样并正确呈现:

{{ 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) }}
Run Code Online (Sandbox Code Playgroud)