Symfony2表单无法提交。表格名称不在请求中

时间:2014-03-18 21:13:34

标签: forms symfony request httprequest

找到解决方案:我没有在我的表单构建器中指定方法。添加setMethod(" POST")解决了我的问题。

我最近开始使用Symfony2(并且学习TDD。猜猜我不喜欢它)并且从今天早上起我的表单出现问题。它曾经工作过,但现在我似乎无法得到有效的回应。

我设法找出了一点错误。 Symfony在HttpFoundationRequestHandler类中得到一个点,它检查它是否应该处理请求(从第56行开始),第59行是它打破的地方

} elseif ($request->request->has($name) || $request->files->has($name)) {

因此,如果我做对了,因为它无法在请求中找到表单的名称,它只是忽略它,相信表单从未提交过。我不能得到的是如何做到这一点,因为唯一可以导致页面更改/刷新的是用户按下"提交"形式的按钮......

如果你们中有人对我的问题有什么建议或简单的指示,我会非常感激!

由于我对这一点感到非常盲目,我会在TrinomeClientVideoUploadForm类下面发布,并在我的Controller中显示并处理表单请求。

这就在这里,如果我用来构建表单的类:

<?php
namespace Trinome\WebVideoViewBundle\Model\Forms;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class TrinomeClientVideoUploadForm extends AbstractType
{
    private $name;

    public function __construct( $name = "trinome_client_video_upload" )
    {
        $this->name = $name;
    }

    /**
     * {@inheritdoc}
     */
    public function buildForm( FormBuilderInterface $builder, array $options )
    {
        $builder->add( "client", "text" )
                ->add( "video", "file" )
                ->add( "upload", "submit" );
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return $this->name;
    }
}

这是在我的(唯一)控制器中处理页面的函数:

/**
 * @Route("/")
 * @Template()
 */
public function indexAction( Request $request )
{
    $uploadVideoForm = new UploadVideoFormDataSet();
    $form = $this->createForm( new TrinomeClientVideoUploadForm(), $uploadVideoForm );

    $form->handleRequest( $request );

    if ( $form->isValid() )
    {
        // It never gets here anyways, so I removed it for this post.
    }

    return array(
        "form" => $form->createView(),
    );
}

我呈现表单的Twig文件:

{% extends "@BaseViews/base.html.twig" %}

{% block title %}Outil d'upload vidéo Trinome{% endblock %}
{% block stylesheets %}
    {% stylesheets '@TrinomeWebVideoViewBundle/Resources/public/css/*' filter='cssrewrite' %}
        <link rel="stylesheet" href="{{ asset_url }}" />
    {% endstylesheets %}
{% endblock %}

{% block body %}
    <div id="wrapper">
        <header>
            {% block header %}
                {% image '@logo_trinome' %}
                    <img src="{{ asset_url }}" alt="Logo Trinome" />
                {% endimage %}
            {% endblock %}
        </header>
        <div id="content">
            {% block content %}
                <h1>Connection</h1>
                {{ form( form ) }}
            {% endblock %}
        </div>
    </div>
{% endblock %}

2 个答案:

答案 0 :(得分:0)

尝试更改此功能

public function getName()
{
    return "oww_yiss_it_works";
}

这是一个疯狂的猜测(我相信构造函数并不像你期望的那样工作)我对symfony不太好,试着回到你已经改变的东西,你会得到问题所在

答案 1 :(得分:0)

您不应该使用构造,尤其是因为您没有从控制器传递$name变量作为参数。然后,您也可以删除私有财产。我不认为这是你的问题,而只是不必要。

在调用createForm方法时,在控制器中,您没有为表单传递操作或方法。我猜你的树枝正在渲染一个没有动作属性的表格。

关于您的表单类型,假设您尝试将对象(或实体)UploadVideoFormDataSet绑定到表单,那么表单类型应该更像这样:

class TrinomeClientVideoUploadForm extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add( "client", "text" )
            ->add( "video", "file" )
            ->add( "upload", "submit" )
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Namespace\YourBundle\Entity\UploadVideoFormDataSet'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'namespace_yourbundle_uploadvideoformdataset';
    } 
}

希望这会对你有所帮助。