复制演示时出错“在映射时无法定义序列项”

时间:2013-09-11 20:16:49

标签: php forms symfony

我在尝试重现Symfony提供的演示时遇到错误。你可以在这里找到它。 http://symfony.com/doc/current/book/forms.html#book-form-creating-form-classes

当我在控制器中包含表单时,我可以让表单正常工作但是当我将表单作为自己的类时,我最终得到一个错误。

  

在映射500内部时,无法定义序列项   服务器错误 - ParseException

日志返回:

  

CRITICAL - 未捕获的PHP异常   Symfony \ Component \ Yaml \ Exception \ ParseException:“你无法定义一个   映射中的序列项“at   /vagrant/vendor/symfony/symfony/src/Symfony/Component/Yaml/Parser.php   第81行

我似乎无法找到问题所在。

Task.php文件:

    <?php

namespace Acme\TaskBundle\Entity;

class Task
{
    protected $task;

    protected $dueDate;

    public function getTask()
    {
        return $this->task;
    }
    public function setTask($task)
    {
        $this->task = $task;
    }

    public function getDueDate()
    {
        return $this->dueDate;
    }
    public function setDueDate(\DateTime $dueDate = null)
    {
        $this->dueDate = $dueDate;
    }
}

DefaultController.php:

<?php
namespace Acme\TaskBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Acme\TaskBundle\Entity\Task;
use Symfony\Component\HttpFoundation\Request;
use Acme\TaskBundle\Form\Type\TaskType;

class DefaultController extends Controller
{
    public function newAction(Request $request)
    {
        // create a task and give it some dummy data for this example
        $task = new Task();

        $form = $this->createForm(new TaskType(), $task);

        $form->handleRequest($request);

        if ($form->isValid()) {
            // perform some action, such as saving the task to the database

            return $this->redirect($this->generateUrl('task_success'));
        }

        return $this->render('AcmeTaskBundle:Default:new.html.twig', array(
            'form' => $form->createView(),
        ));
    }
}

TaskType.php:

<?php

// src/Acme/TaskBundle/Form/Type/TaskType.php
namespace Acme\TaskBundle\Form\Type;

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

class TaskType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('task')
            ->add('dueDate', null, array('mapped' => false))
            ->add('save', 'submit');
    }

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

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\TaskBundle\Entity\Task',
        ));
    }
}

如果您还有其他需要,请告诉我。我在多个文件中尝试过此设置。它必须是小事。它就在Symfony的网站上。


修改


我唯一拥有的YML文件是我在教程中使用的验证文件。 validation.yml文件

# Acme/TaskBundle/Resources/config/validation.yml
Acme\TaskBundle\Entity\Task:
    properties:
        task:
            - NotBlank: ~
        dueDate:
            - NotBlank: ~
            - Type: \DateTime

问题可能是我没有定义数组的yml文件吗?

2 个答案:

答案 0 :(得分:4)

你的yml文件中有没有像这样的东西......

stuff:
    thing1: one      // mapping
    thing2: two      // mapping
    thing3: three    // mapping
    - four           // sequence

根据我的猜测,错误是说你不能在同一个数组语句中混合你的yaml“mapping”和“sequence”。

所以它需要是......

stuff:
    thing1: one
    thing2: two
    thing3: 
        - four

stuff:
    thing1: one
    thing2: two
    thing3: three
    thing4: four

取决于您尝试创建的阵列类型

答案 1 :(得分:0)

在您的类型类更改行->add('dueDate', null, array('mapped' => false))->add('dueDate', null, array())

您的dueDate字段确实已映射